├── .github └── ISSUE_TEMPLATE │ ├── -------.md │ └── bug---.md ├── .gitignore ├── .gitmodules ├── ColorPicker ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── jaredrummler │ │ └── android │ │ └── colorpicker │ │ ├── AlphaPatternDrawable.java │ │ ├── ColorPaletteAdapter.java │ │ ├── ColorPanelView.java │ │ ├── ColorPickerDialog.java │ │ ├── ColorPickerDialogListener.java │ │ ├── ColorPickerView.java │ │ ├── ColorPreference.java │ │ ├── ColorShape.java │ │ ├── DrawingUtils.java │ │ └── NestedGridView.java │ └── res │ ├── drawable-hdpi │ └── cpv_alpha.png │ ├── drawable-xhdpi │ └── cpv_alpha.png │ ├── drawable-xxhdpi │ └── cpv_alpha.png │ ├── drawable │ ├── cpv_btn_background.xml │ ├── cpv_btn_background_pressed.xml │ ├── cpv_ic_arrow_right_black_24dp.xml │ └── cpv_preset_checked.xml │ ├── layout │ ├── cpv_color_item_circle.xml │ ├── cpv_color_item_square.xml │ ├── cpv_dialog_color_picker.xml │ ├── cpv_dialog_presets.xml │ ├── cpv_preference_circle.xml │ ├── cpv_preference_circle_large.xml │ ├── cpv_preference_square.xml │ └── cpv_preference_square_large.xml │ ├── values-zh │ └── strings.xml │ └── values │ ├── attrs.xml │ ├── dimen.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── config │ │ └── view │ │ │ ├── floatbutton.txt │ │ │ └── picposition.txt │ ├── icon │ │ ├── bubble_left.9.png │ │ ├── bubble_right.9.png │ │ ├── ic_add.png │ │ ├── ic_chat.png │ │ ├── ic_friendsgroup.png │ │ ├── ic_money.png │ │ ├── ic_person_add.png │ │ ├── ic_scan.png │ │ ├── ic_search.png │ │ ├── red_pocket_left.9.png │ │ ├── red_pocket_left_unopened.9.png │ │ ├── red_pocket_right.9.png │ │ ├── red_pocket_right_unopened.9.png │ │ ├── tab_bg0.png │ │ ├── tab_bg1.png │ │ ├── tab_bg2.png │ │ ├── tab_bg3.png │ │ ├── tab_icon0.bak.png │ │ ├── tab_icon0.png │ │ ├── tab_icon1.bak.png │ │ ├── tab_icon1.png │ │ ├── tab_icon2.bak.png │ │ ├── tab_icon2.png │ │ ├── tab_icon3.bak.png │ │ └── tab_icon3.png │ └── xposed_init │ ├── java │ └── com │ │ └── blanke │ │ └── mdwechat │ │ ├── CC.java │ │ ├── Classes.kt │ │ ├── Common.kt │ │ ├── Fields.kt │ │ ├── Methods.kt │ │ ├── Objects.kt │ │ ├── Version.java │ │ ├── VersionKt.kt │ │ ├── ViewTreeRepo.kt │ │ ├── WeChatHelper.kt │ │ ├── WechatGlobal.kt │ │ ├── WechatHook.kt │ │ ├── auto_search │ │ ├── ClassNotSupported.java │ │ ├── Classes.kt │ │ ├── Fields.kt │ │ ├── Logs.kt │ │ ├── Main.kt │ │ ├── Methods.kt │ │ ├── WechatGlobal.kt │ │ └── bean │ │ │ ├── LogEvent.kt │ │ │ └── OutputJson.kt │ │ ├── bean │ │ ├── FloatButtonConfig.kt │ │ ├── PicPositionConfig.kt │ │ └── ViewTreeItem.kt │ │ ├── config │ │ ├── AppCustomConfig.kt │ │ ├── HookConfig.kt │ │ ├── ViewTreeConfig.java │ │ └── WxVersionConfig.kt │ │ ├── hookers │ │ ├── ActionBarHooker.kt │ │ ├── AvatarHooker.kt │ │ ├── ContactHooker.kt │ │ ├── ContextHooker.kt │ │ ├── ConversationHooker.kt │ │ ├── DebugHooker.kt │ │ ├── DiscoverHooker.kt │ │ ├── LauncherUIHooker.kt │ │ ├── ListViewHooker.kt │ │ ├── LogHooker.kt │ │ ├── NightModeHooker.kt │ │ ├── SchemeHooker.kt │ │ ├── SettingsHooker.kt │ │ ├── StatusBarHooker.kt │ │ ├── base │ │ │ ├── Hooker.kt │ │ │ └── HookerProvider.kt │ │ └── main │ │ │ ├── BackgroundImageHook.kt │ │ │ ├── ChattingRoomHook.kt │ │ │ ├── FloatMenuHook.kt │ │ │ ├── HomeActionBarHook.kt │ │ │ └── TabLayoutHook.kt │ │ ├── markdown │ │ └── MarkDownActivity.kt │ │ ├── settings │ │ ├── SettingsActivity.kt │ │ ├── SettingsFragment.kt │ │ ├── api │ │ │ └── APIManager.kt │ │ ├── bean │ │ │ ├── NewestVersionConfig.kt │ │ │ └── WechatConfig.kt │ │ └── view │ │ │ └── DownloadWechatDialog.kt │ │ ├── util │ │ ├── BitmapUtil.kt │ │ ├── ColorUtils.java │ │ ├── ConvertUtils.java │ │ ├── DrawableUtils.java │ │ ├── FileUtils.kt │ │ ├── ImageHelper.java │ │ ├── KtUtils.kt │ │ ├── LogUtil.kt │ │ ├── NightModeUtils.kt │ │ ├── NinePatchBitmapFactory.java │ │ ├── ReflectionUtil.kt │ │ ├── VXPUtils.kt │ │ ├── ViewTreeUtils.kt │ │ └── ViewUtils.kt │ │ └── widget │ │ ├── CircleImageView.kt │ │ └── MaterialSearchView.kt │ └── res │ ├── drawable-xxhdpi │ ├── ic_add.png │ ├── ic_arrow_back.png │ ├── ic_clear.png │ └── ic_done.png │ ├── layout │ ├── activity_mark_down.xml │ ├── activity_settings.xml │ ├── item_wechat_config.xml │ ├── preference_category.xml │ ├── preference_hidden.xml │ ├── preference_info.xml │ ├── preference_screen.xml │ ├── preference_warning.xml │ └── view_floatbutton.xml │ ├── mipmap-xhdpi │ └── mdwechat_icon.png │ ├── values │ ├── arrays.xml │ ├── colors.xml │ ├── dimen.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── pref_settings.xml ├── build.gradle ├── data ├── config │ └── wechat │ │ ├── 6.6.6 │ │ └── 6.6.6.config │ │ ├── 6.6.7-play │ │ └── 6.6.7.config │ │ ├── 6.7.2-play │ │ └── 6.7.2.config │ │ ├── 6.7.2 │ │ └── 6.7.2.config │ │ ├── 6.7.3-play │ │ └── 6.7.3.config │ │ ├── 6.7.3 │ │ └── 6.7.3.config │ │ ├── 7.0.0 │ │ └── 7.0.0.config │ │ ├── 7.0.10 │ │ └── 7.0.10.config │ │ ├── 7.0.11 │ │ └── 7.0.11.config │ │ ├── 7.0.12-play │ │ └── 7.0.12.config │ │ ├── 7.0.12 │ │ └── 7.0.12.config │ │ ├── 7.0.13-playx64 │ │ └── 7.0.13.config │ │ ├── 7.0.13 │ │ └── 7.0.13.config │ │ ├── 7.0.13x64 │ │ └── 7.0.13.config │ │ ├── 7.0.14 │ │ └── 7.0.14.config │ │ ├── 7.0.15 │ │ └── 7.0.15.config │ │ ├── 7.0.16 │ │ └── 7.0.16.config │ │ ├── 7.0.17-play │ │ └── 7.0.17.config │ │ ├── 7.0.17 │ │ └── 7.0.17.config │ │ ├── 7.0.18 │ │ └── 7.0.18.config │ │ ├── 7.0.21-play │ │ └── 7.0.21.config │ │ ├── 7.0.22 │ │ └── 7.0.22.config │ │ ├── 7.0.3 │ │ └── 7.0.3.config │ │ ├── 7.0.4 │ │ └── 7.0.4.config │ │ ├── 7.0.5 │ │ └── 7.0.5.config │ │ ├── 7.0.6 │ │ └── 7.0.6.config │ │ ├── 7.0.7 │ │ └── 7.0.7.config │ │ ├── 7.0.8 │ │ └── 7.0.8.config │ │ ├── 7.0.9 │ │ └── 7.0.9.config │ │ ├── 8.0.0 │ │ └── 8.0.0.config │ │ ├── 8.0.1 │ │ └── 8.0.1.config │ │ ├── 8.0.14 │ │ └── 8.0.14.config │ │ ├── 8.0.15 │ │ └── 8.0.15.config │ │ ├── 8.0.16 │ │ └── 8.0.16.config │ │ ├── 8.0.2 │ │ └── 8.0.2.config │ │ ├── 8.0.20 │ │ └── 8.0.20.config │ │ ├── 8.0.24 │ │ └── 8.0.24.config │ │ ├── 8.0.3 │ │ └── 8.0.3.config │ │ ├── 8.0.31 │ │ └── 8.0.31.config │ │ ├── 8.0.32 │ │ └── 8.0.32.config │ │ ├── 8.0.6 │ │ └── 8.0.6.config │ │ └── data.json ├── help │ ├── bubble.md │ ├── float_button.md │ ├── icon.md │ └── join_group.md └── newest_version.json ├── fab-lib ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── github │ │ └── clans │ │ └── fab │ │ ├── FloatingActionButton.java │ │ ├── FloatingActionMenu.java │ │ ├── Label.java │ │ └── Util.java │ └── res │ ├── anim │ ├── fab_scale_down.xml │ ├── fab_scale_up.xml │ ├── fab_slide_in_from_left.xml │ ├── fab_slide_in_from_right.xml │ ├── fab_slide_out_to_left.xml │ └── fab_slide_out_to_right.xml │ └── values │ ├── attrs.xml │ ├── dimens.xml │ └── ids.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── image ├── chat00.png ├── chat01.png ├── color_scheme.png ├── demo.gif ├── main00.png ├── main01.png ├── main02.png ├── main03.png ├── main05.png ├── res_correct.png ├── res_too_large.png ├── res_too_small.png ├── res_too_small_1.png └── sample_1080_2340.png ├── settings.gradle ├── tablayout-lib ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── flyco │ │ └── tablayout │ │ ├── CommonTabLayout.java │ │ ├── SegmentTabLayout.java │ │ ├── SlidingTabLayout.java │ │ ├── listener │ │ ├── CustomTabEntity.java │ │ └── OnTabSelectListener.java │ │ ├── utils │ │ ├── FragmentChangeManager.java │ │ └── UnreadMsgUtils.java │ │ └── widget │ │ └── MsgView.java │ └── res │ ├── drawable │ └── shape_unread.xml │ ├── layout │ ├── layout_tab.xml │ ├── layout_tab_bottom.xml │ ├── layout_tab_left.xml │ ├── layout_tab_right.xml │ ├── layout_tab_segment.xml │ └── layout_tab_top.xml │ └── values │ └── attrs.xml └── takephoto-lib ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src ├── androidTest └── java │ └── org │ └── devio │ └── takephoto │ └── ApplicationTest.java └── main ├── AndroidManifest.xml ├── java └── org │ └── devio │ └── takephoto │ ├── app │ ├── TakePhoto.java │ ├── TakePhotoActivity.java │ ├── TakePhotoFragment.java │ ├── TakePhotoFragmentActivity.java │ └── TakePhotoImpl.java │ ├── compress │ ├── CompressConfig.java │ ├── CompressImage.java │ ├── CompressImageImpl.java │ ├── CompressImageUtil.java │ └── CompressWithLuBan.java │ ├── model │ ├── CropOptions.java │ ├── InvokeParam.java │ ├── LubanOptions.java │ ├── MultipleCrop.java │ ├── TContextWrap.java │ ├── TException.java │ ├── TExceptionType.java │ ├── TImage.java │ ├── TIntentWap.java │ ├── TResult.java │ └── TakePhotoOptions.java │ ├── permission │ ├── InvokeListener.java │ ├── PermissionManager.java │ └── TakePhotoInvocationHandler.java │ └── uitl │ ├── ImageRotateUtil.java │ ├── IntentUtils.java │ ├── TConstant.java │ ├── TFileUtils.java │ ├── TImageFiles.java │ ├── TUriParse.java │ └── TUtils.java └── res ├── values-en └── strings.xml ├── values-w820dp └── dimens.xml ├── values ├── dimens.xml └── strings.xml └── xml └── file_paths.xml /.github/ISSUE_TEMPLATE/-------.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 功能建议或其他 3 | about: 提交 bug 请不要选择该模板 4 | 5 | --- 6 | 7 | 8 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug---.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug 反馈 3 | about: 提交 bug 的 issue 模板 4 | 5 | --- 6 | 7 | 请按以下步骤填写,不规范的 issue 会被关闭 8 | **bug 描述** 9 | 请描述你遇到的问题 10 | 11 | **环境** 12 | 1. Android 版本 13 | 2. 机型 14 | 3. MDWechat 版本 15 | 4. Xposed 环境及版本 16 | 5. 微信版本 17 | 18 | **复现步骤** 19 | 1. 进入主界面 20 | 2. 点击 xxx 21 | 3. 出现 xxx 现象 22 | 23 | **期望** 24 | 描述期望的结果 25 | 26 | **截图** 27 | 截图 28 | 29 | **日志(可选)** 30 | 日志 31 | 32 | **其他说明** 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | /.idea 11 | /app/release 12 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/.gitmodules -------------------------------------------------------------------------------- /ColorPicker/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /ColorPicker/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 27 5 | resourcePrefix "cpv_" 6 | 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 27 10 | } 11 | } 12 | 13 | dependencies { 14 | //noinspection GradleCompatible 15 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 16 | } 17 | -------------------------------------------------------------------------------- /ColorPicker/gradle.properties: -------------------------------------------------------------------------------- 1 | VERSION_NAME=1.0.0 2 | VERSION_CODE=100 3 | GROUP=com.jaredrummler 4 | ARTIFACT_ID=colorpicker 5 | 6 | POM_NAME=colorpicker 7 | POM_ARTIFACT_ID=colorpicker 8 | POM_PACKAGING=aar 9 | 10 | POM_DESCRIPTION=A simple good looking color picker component for Android 11 | POM_URL=https://github.com/jaredrummler/ColorPicker 12 | POM_SCM_URL=https://github.com/jaredrummler/ColorPicker 13 | POM_SCM_CONNECTION=scm:git@github.com:jaredrummler/ColorPicker.git 14 | POM_SCM_DEV_CONNECTION=scm:git@github.com:jaredrummler/ColorPicker.git 15 | POM_LICENCE_NAME=The Apache Software License, Version 2.0 16 | POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt 17 | POM_LICENCE_DIST=repo 18 | POM_DEVELOPER_ID=jaredrummler 19 | POM_DEVELOPER_NAME=Jared Rummler 20 | 21 | SNAPSHOT_REPOSITORY_URL=https://oss.sonatype.org/content/repositories/snapshots 22 | RELEASE_REPOSITORY_URL=https://oss.sonatype.org/service/local/staging/deploy/maven2 -------------------------------------------------------------------------------- /ColorPicker/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in C:\android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /ColorPicker/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ColorPicker/src/main/java/com/jaredrummler/android/colorpicker/ColorPickerDialogListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 Jared Rummler 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.jaredrummler.android.colorpicker; 18 | 19 | import androidx.annotation.ColorInt; 20 | 21 | /** 22 | * Callback used for getting the selected color from a color picker dialog. 23 | */ 24 | public interface ColorPickerDialogListener { 25 | 26 | /** 27 | * Callback that is invoked when a color is selected from the color picker dialog. 28 | * 29 | * @param dialogId 30 | * The dialog id used to create the dialog instance. 31 | * @param color 32 | * The selected color 33 | */ 34 | void onColorSelected(int dialogId, @ColorInt int color); 35 | 36 | /** 37 | * Callback that is invoked when the color picker dialog was dismissed. 38 | * 39 | * @param dialogId 40 | * The dialog id used to create the dialog instance. 41 | */ 42 | void onDialogDismissed(int dialogId); 43 | 44 | } 45 | -------------------------------------------------------------------------------- /ColorPicker/src/main/java/com/jaredrummler/android/colorpicker/ColorShape.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 Jared Rummler 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.jaredrummler.android.colorpicker; 18 | 19 | import androidx.annotation.IntDef; 20 | 21 | /** 22 | * The shape of the color preview 23 | */ 24 | @IntDef({ColorShape.SQUARE, ColorShape.CIRCLE}) 25 | public @interface ColorShape { 26 | 27 | int SQUARE = 0; 28 | 29 | int CIRCLE = 1; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /ColorPicker/src/main/java/com/jaredrummler/android/colorpicker/DrawingUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 Jared Rummler 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.jaredrummler.android.colorpicker; 18 | 19 | import android.content.Context; 20 | import android.util.DisplayMetrics; 21 | import android.util.TypedValue; 22 | 23 | final class DrawingUtils { 24 | 25 | static int dpToPx(Context c, float dipValue) { 26 | DisplayMetrics metrics = c.getResources().getDisplayMetrics(); 27 | float val = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, metrics); 28 | int res = (int) (val + 0.5); // Round 29 | // Ensure at least 1 pixel if val was > 0 30 | return res == 0 && val > 0 ? 1 : res; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /ColorPicker/src/main/java/com/jaredrummler/android/colorpicker/NestedGridView.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2017 Jared Rummler 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.jaredrummler.android.colorpicker; 18 | 19 | import android.content.Context; 20 | import android.util.AttributeSet; 21 | import android.widget.GridView; 22 | 23 | public class NestedGridView extends GridView { 24 | 25 | public NestedGridView(Context context) { 26 | super(context); 27 | } 28 | 29 | public NestedGridView(Context context, AttributeSet attrs) { 30 | super(context, attrs); 31 | } 32 | 33 | public NestedGridView(Context context, AttributeSet attrs, int defStyle) { 34 | super(context, attrs, defStyle); 35 | } 36 | 37 | @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 38 | int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); 39 | super.onMeasure(widthMeasureSpec, expandSpec); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable-hdpi/cpv_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/ColorPicker/src/main/res/drawable-hdpi/cpv_alpha.png -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable-xhdpi/cpv_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/ColorPicker/src/main/res/drawable-xhdpi/cpv_alpha.png -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable-xxhdpi/cpv_alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/ColorPicker/src/main/res/drawable-xxhdpi/cpv_alpha.png -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable/cpv_btn_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable/cpv_btn_background_pressed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable/cpv_ic_arrow_right_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/drawable/cpv_preset_checked.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/layout/cpv_color_item_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 23 | 24 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/layout/cpv_color_item_square.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 23 | 24 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/layout/cpv_preference_circle.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/layout/cpv_preference_circle_large.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/layout/cpv_preference_square.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/layout/cpv_preference_square_large.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/values-zh/strings.xml: -------------------------------------------------------------------------------- 1 | 15 | 16 | 17 | 选择颜色 18 | 预设 19 | 自定义 20 | 确定 21 | 透明度 22 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/values/dimen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6dp 4 | 66dp 5 | 34dp 6 | 58dp 7 | 50dp 8 | 8dp 9 | 28dp 10 | 40dp 11 | 12 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 16 | 17 | 18 | Select a Color 19 | Presets 20 | Custom 21 | Select 22 | Transparency 23 | -------------------------------------------------------------------------------- /ColorPicker/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 17 | 18 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.idea -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/blanke/android/android-sdk-macosx/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 16 | 17 | 22 | 23 | 26 | 29 | 32 | 33 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/src/main/assets/config/view/floatbutton.txt: -------------------------------------------------------------------------------- 1 | { 2 | "info": "自定义悬浮按钮", 3 | "menu": { 4 | "icon": "ic_add.png" 5 | }, 6 | "items": [ 7 | { 8 | "order": 1, 9 | "type":"com.tencent.mm.ui.contact.SelectContactUI", 10 | "text": "群聊", 11 | "icon": "ic_chat.png" 12 | }, 13 | { 14 | "order": 2, 15 | "type": "com.tencent.mm.plugin.subapp.ui.pluginapp.AddMoreFriendsUI", 16 | "text": "添加好友", 17 | "icon": "ic_person_add.png" 18 | }, 19 | { 20 | "order": 3, 21 | "type": "com.tencent.mm.plugin.offline.ui.WalletOfflineCoinPurseUI", 22 | "text": "收付款", 23 | "icon": "ic_money.png" 24 | }, 25 | { 26 | "order": 4, 27 | "type": "com.tencent.mm.plugin.scanner.ui.BaseScanUI", 28 | "text": "扫一扫", 29 | "icon": "ic_scan.png" 30 | }, 31 | { 32 | "order": 5, 33 | "type": "com.tencent.mm.plugin.fts.ui.FTSMainUI", 34 | "text": "搜索", 35 | "icon": "ic_search.png" 36 | }, 37 | { 38 | "order": 6, 39 | "type": "com.tencent.mm.plugin.sns.ui.SnsTimeLineUI", 40 | "text": "朋友圈", 41 | "icon": "ic_friendsgroup.png" 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /app/src/main/assets/config/view/picposition.txt: -------------------------------------------------------------------------------- 1 | //提示:此文件自动生成,用于保存沉浸背景的图片位置信息。 2 | //created by JoshCai 3 | { 4 | lastModifiedTimeOfSettings:0, 5 | screenHeight:-1, 6 | backgroundPicPos:[ 7 | {y:0,height:0}, 8 | {y:0,height:0}, 9 | {y:0,height:0}, 10 | {y:0,height:0} 11 | ] 12 | } -------------------------------------------------------------------------------- /app/src/main/assets/icon/bubble_left.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/bubble_left.9.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/bubble_right.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/bubble_right.9.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_add.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_chat.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_friendsgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_friendsgroup.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_money.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_money.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_person_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_person_add.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_scan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_scan.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/ic_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/ic_search.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/red_pocket_left.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/red_pocket_left.9.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/red_pocket_left_unopened.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/red_pocket_left_unopened.9.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/red_pocket_right.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/red_pocket_right.9.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/red_pocket_right_unopened.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/red_pocket_right_unopened.9.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_bg0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_bg0.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_bg1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_bg1.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_bg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_bg2.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_bg3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_bg3.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon0.bak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon0.bak.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon0.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon1.bak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon1.bak.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon1.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon2.bak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon2.bak.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon2.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon3.bak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon3.bak.png -------------------------------------------------------------------------------- /app/src/main/assets/icon/tab_icon3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/assets/icon/tab_icon3.png -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | com.blanke.mdwechat.WechatHook -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/CC.java: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat; 2 | 3 | @SuppressWarnings("rawtypes") 4 | public class CC { 5 | public static final Class voidd = void.class; 6 | public static final Class LinearLayout = android.widget.LinearLayout.class; 7 | public static final Class RelativeLayout = android.widget.RelativeLayout.class; 8 | public static final Class FrameLayout = android.widget.FrameLayout.class; 9 | public static final Class ImageView = android.widget.ImageView.class; 10 | public static final Class ImageButton = android.widget.ImageButton.class; 11 | public static final Class Button = android.widget.Button.class; 12 | public static final Class TableLayout = android.widget.TableLayout.class; 13 | public static final Class TableRow = android.widget.TableRow.class; 14 | public static final Class TextView = android.widget.TextView.class; 15 | public static final Class CheckBox = android.widget.CheckBox.class; 16 | public static final Class ProgressBar = android.widget.ProgressBar.class; 17 | public static final Class ViewStub = android.view.ViewStub.class; 18 | public static final Class View = android.view.View.class; 19 | public static final Class ListView = android.widget.ListView.class; 20 | public static final Class Menu = android.view.Menu.class; 21 | 22 | public static final Class Activity = android.app.Activity.class; 23 | public static final Class Bundle = android.os.Bundle.class; 24 | public static final Class Context = android.content.Context.class; 25 | public static final Class Intent = android.content.Intent.class; 26 | public static final Class MotionEvent = android.view.MotionEvent.class; 27 | 28 | public static final Class Object = Object.class; 29 | public static final Class String = String.class; 30 | public static final Class Boolean = boolean.class; 31 | public static final Class Int = int.class; 32 | public static final Class Float = float.class; 33 | public static final Class Long = long.class; 34 | 35 | public static final Class Field= java.lang.reflect.Field.class; 36 | 37 | public static final String WeImageView = "com.tencent.mm.ui.widget.imageview.WeImageView"; 38 | public static final String WeImageButton = "com.tencent.mm.ui.widget.imageview.WeImageButton"; 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/Objects.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat 2 | 3 | import android.app.Activity 4 | import android.content.Context 5 | import android.view.MenuItem 6 | import android.view.View 7 | import com.blanke.mdwechat.util.LogUtil 8 | import com.flyco.tablayout.CommonTabLayout 9 | 10 | object Objects { 11 | object Main { 12 | var context: Context? = null 13 | 14 | //当前的 activity, 用于朋友圈 actionbar 上色 15 | var activityNow: Class<*>? = null 16 | 17 | var LauncherUI: Activity? = null 18 | var LauncherUI_mContentLayout: View? = null 19 | var HomeUI_mActionBar: Any? = null 20 | var LauncherUI_mViewPager: View? = null 21 | var LauncherUI_mTabLayout: CommonTabLayout? = null 22 | var LauncherUI_mWechatXMenuItem: MenuItem? = null 23 | var statusView: View? = null 24 | var actionBar: View? = null 25 | 26 | var tabLayout: CommonTabLayout? = null 27 | var contactPageFix: View? = null 28 | var pagePosition = 0 29 | 30 | //小程序下拉之后的填空 31 | var actionBarAppbrandFix: View? = null 32 | } 33 | 34 | var setContextCount = 0 35 | fun setContext(context: Context) { 36 | if (context == Main.context) { 37 | return 38 | } 39 | setContextCount++ 40 | LogUtil.log("context 已改变, 次数 = $setContextCount, context = $context") 41 | Main.context = context 42 | } 43 | 44 | // fun clear() { 45 | // Main.LauncherUI=null 46 | // Main.LauncherUI_mContentLayout=null 47 | // Main.HomeUI_mActionBar=null 48 | // Main.LauncherUI_mViewPager.clear() 49 | // Main.LauncherUI_mTabLayout.clear() 50 | // Main.LauncherUI_mWechatXMenuItem.clear() 51 | // } 52 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/Version.java: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | // Version is a helper class for comparing version strings. 9 | public class Version { 10 | private String versionName; 11 | 12 | private List version = new ArrayList<>(); 13 | 14 | public Version(String versionName) { 15 | this.versionName = versionName; 16 | String[] version = versionName.split("\\."); 17 | for (String s : version) { 18 | this.version.add(Integer.parseInt(s)); 19 | } 20 | } 21 | 22 | public String toString() { 23 | return versionName; 24 | } 25 | 26 | public boolean equals(Version other) { 27 | if (other == null) return false; 28 | return this.versionName.equals(other.versionName); 29 | } 30 | 31 | public int compareTo(@NotNull Version other) { 32 | return compare(this, other); 33 | } 34 | 35 | private static int compare(@NotNull Version x, @NotNull Version y) { 36 | for (int index = 0; index < x.version.size() && index < y.version.size(); index++) { 37 | if (x.version.get(index) > y.version.get(index)) return 1; 38 | if (x.version.get(index) < y.version.get(index)) return -1; 39 | } 40 | return Integer.compare(x.version.size(), y.version.size()); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/VersionKt.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat 2 | 3 | // Version is a helper class for comparing version strings. 4 | class VersionKt(private val versionName: String) { 5 | 6 | val version: List = versionName.split('.').mapNotNull(String::toIntOrNull) 7 | 8 | override fun toString() = versionName 9 | 10 | override fun hashCode(): Int = version.hashCode() 11 | 12 | override fun equals(other: Any?): Boolean = when (other) { 13 | null -> false 14 | !is VersionKt -> false 15 | else -> this.version == other.version 16 | } 17 | 18 | operator fun compareTo(other: VersionKt): Int { 19 | var result = 0 20 | when { 21 | this.version.size > other.version.size -> result = 1 22 | this.version.size < other.version.size -> result = -1 23 | } 24 | 25 | var index = 0 26 | while (index < this.version.size && index < other.version.size) { 27 | when { 28 | this.version[index] > other.version[index] -> return 1 29 | this.version[index] < other.version[index] -> return -1 30 | } 31 | index++ 32 | } 33 | 34 | return result 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/WechatGlobal.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat 2 | 3 | import android.content.Context 4 | import com.blanke.mdwechat.config.WxVersionConfig 5 | import com.blanke.mdwechat.util.LogUtil 6 | import de.robv.android.xposed.XposedHelpers 7 | import de.robv.android.xposed.callbacks.XC_LoadPackage 8 | 9 | object WechatGlobal { 10 | //play版等部分微信需要提前识别classLoader 11 | var preloaded = false 12 | // var hookersLoaded=false 13 | 14 | @Volatile 15 | var wxVersion: Version? = null 16 | 17 | @Volatile 18 | var wxPackageName: String = "" 19 | 20 | @Volatile 21 | lateinit var wxLoader: ClassLoader 22 | lateinit var wxClasses: List 23 | lateinit var wxVersionConfig: WxVersionConfig 24 | 25 | @JvmStatic 26 | fun init(lpparam: XC_LoadPackage.LoadPackageParam) { 27 | wxPackageName = lpparam.packageName 28 | val context = XposedHelpers.callMethod( 29 | XposedHelpers.callStaticMethod(XposedHelpers.findClass("android.app.ActivityThread", null), 30 | "currentActivityThread"), "getSystemContext") as Context 31 | wxVersion = Version(context.packageManager.getPackageInfo(wxPackageName, 0)?.versionName 32 | ?: "") 33 | wxLoader = lpparam.classLoader 34 | } 35 | 36 | fun wxLazy(initializer: () -> T?): Lazy { 37 | return wxLazy("", initializer) 38 | } 39 | 40 | fun wxLazy(name: String, initializer: () -> T?): Lazy { 41 | return lazy(LazyThreadSafetyMode.PUBLICATION) { 42 | val res = initializer() 43 | if (res == null) { 44 | LogUtil.log("$name == null ") 45 | } 46 | res!! 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/auto_search/ClassNotSupported.java: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.auto_search; 2 | 3 | import org.jetbrains.annotations.Nullable; 4 | 5 | import java.lang.reflect.Field; 6 | 7 | // 占位符 8 | public class ClassNotSupported { 9 | @Nullable 10 | public static final Field fieldNotSupported = null; 11 | 12 | public boolean MethodNotSupported() { 13 | return methodNotSupported; 14 | } 15 | 16 | public boolean methodNotSupported=true; 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/auto_search/Logs.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.auto_search 2 | 3 | import com.blanke.mdwechat.auto_search.bean.LogEvent 4 | import com.blanke.mdwechat.util.LogUtil 5 | import com.blankj.utilcode.util.LogUtils 6 | import org.greenrobot.eventbus.EventBus 7 | 8 | object Logs { 9 | fun i(msg: String) { 10 | EventBus.getDefault().post(LogEvent(msg)) 11 | LogUtils.i(msg) 12 | LogUtil.log(msg) 13 | } 14 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/auto_search/WechatGlobal.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.auto_search 2 | 3 | import com.blanke.mdwechat.Version 4 | 5 | 6 | object WechatGlobal { 7 | var wxPackageName: String = "" 8 | var wxVersion: Version? = null 9 | lateinit var wxLoader: ClassLoader 10 | lateinit var wxClasses: List 11 | 12 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/auto_search/bean/LogEvent.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.auto_search.bean 2 | 3 | class LogEvent(val msg: String) -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/auto_search/bean/OutputJson.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.auto_search.bean 2 | 3 | class OutputJson(val classes: Map, val methods: Map, val fields: Map) -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/bean/FloatButtonConfig.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.bean 2 | 3 | /** 4 | * Created by blanke on 2017/10/13. 5 | */ 6 | 7 | data class FloatButtonConfig(var info: String = "", var menu: FLoatButtonConfigItem?, var items: Array?) 8 | 9 | data class FLoatButtonConfigItem(var order: Int = 0, var type: String = "", var icon: String = "", var text: String = "") 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/bean/PicPositionConfig.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.bean 2 | 3 | /** 4 | * Created by blanke on 2017/10/13. 5 | */ 6 | 7 | data class PicPositionConfig( 8 | var lastModifiedTimeOfSettings: Long = 0, 9 | var screenHeight: Int = -1, 10 | var backgroundPicPos: MutableList? 11 | ) 12 | 13 | data class PicPosition(var y: Int = 0, var height: Int = 0) -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/bean/ViewTreeItem.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.bean 2 | 3 | class ViewTree( 4 | val treeStacks: Map = mapOf(), 5 | val item: ViewTreeItem 6 | ) 7 | class ViewTreeItem( 8 | val clazz: String, 9 | val children: Array = arrayOf() 10 | ) -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/AvatarHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.graphics.Bitmap 4 | import com.blanke.mdwechat.CC 5 | import com.blanke.mdwechat.Classes.AvatarUtils 6 | import com.blanke.mdwechat.Methods.AvatarUtils_getAvatarBitmaps 7 | import com.blanke.mdwechat.Methods.AvatarUtils_getDefaultAvatarBitmap 8 | import com.blanke.mdwechat.config.HookConfig 9 | import com.blanke.mdwechat.hookers.base.Hooker 10 | import com.blanke.mdwechat.hookers.base.HookerProvider 11 | import com.blanke.mdwechat.util.ImageHelper 12 | import de.robv.android.xposed.XC_MethodHook 13 | import de.robv.android.xposed.XposedHelpers 14 | 15 | object AvatarHooker : HookerProvider { 16 | override fun provideStaticHookers(): List? { 17 | return listOf(avatarUtilsHook) 18 | } 19 | 20 | private val avatarUtilsHook = Hooker { 21 | if (HookConfig.is_hook_avatar) { 22 | XposedHelpers.findAndHookMethod(AvatarUtils, AvatarUtils_getDefaultAvatarBitmap.name, object : XC_MethodHook() { 23 | override fun afterHookedMethod(param: MethodHookParam?) { 24 | param?.result?.apply { 25 | param.result = getCircleBitmap(this as Bitmap) 26 | } 27 | } 28 | }) 29 | AvatarUtils_getAvatarBitmaps.forEach { 30 | XposedHelpers.findAndHookMethod(AvatarUtils, it.name, CC.String, object : XC_MethodHook() { 31 | override fun afterHookedMethod(param: MethodHookParam?) { 32 | param?.result?.apply { 33 | param.result = getCircleBitmap(this as Bitmap) 34 | } 35 | } 36 | }) 37 | } 38 | } 39 | } 40 | 41 | private fun getCircleBitmap(bitmap: Bitmap): Bitmap? { 42 | return ImageHelper.getRoundedCornerBitmap(bitmap, bitmap.height / 2) 43 | } 44 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/ContextHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.app.Application 4 | import com.blanke.mdwechat.Objects 5 | import com.blanke.mdwechat.hookers.base.Hooker 6 | import com.blanke.mdwechat.hookers.base.HookerProvider 7 | import com.blanke.mdwechat.util.LogUtil 8 | import de.robv.android.xposed.XC_MethodHook 9 | import de.robv.android.xposed.XposedHelpers 10 | 11 | 12 | object ContextHooker : HookerProvider { 13 | override fun provideStaticHookers(): List? { 14 | return listOf(contextHook) 15 | } 16 | 17 | // 获取 context 用于 toast 18 | private val contextHook = Hooker { 19 | val clazz = XposedHelpers.findClass("android.app.Instrumentation", null) 20 | XposedHelpers.findAndHookMethod(clazz, 21 | "callApplicationOnCreate", 22 | Application::class.java, 23 | object : XC_MethodHook() { 24 | 25 | @Throws(Throwable::class) 26 | override fun afterHookedMethod(param: MethodHookParam) { 27 | super.afterHookedMethod(param) 28 | if (param.args[0] is Application) { 29 | Objects.setContext((param.args[0] as Application).applicationContext) 30 | // LogUtil.toast("${Objects.Main.context}") 31 | } 32 | } 33 | }) 34 | } 35 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/DebugHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.view.MotionEvent 4 | import android.view.View 5 | import com.blanke.mdwechat.CC 6 | import com.blanke.mdwechat.WechatGlobal 7 | import com.blanke.mdwechat.config.HookConfig 8 | import com.blanke.mdwechat.hookers.base.Hooker 9 | import com.blanke.mdwechat.hookers.base.HookerProvider 10 | import com.blanke.mdwechat.util.LogUtil 11 | import com.blanke.mdwechat.util.ViewUtils 12 | import de.robv.android.xposed.XC_MethodHook 13 | import de.robv.android.xposed.XposedBridge 14 | import de.robv.android.xposed.XposedHelpers 15 | 16 | object DebugHooker : HookerProvider { 17 | override fun provideStaticHookers(): List? { 18 | return listOf(viewTouchHook) 19 | } 20 | 21 | private val viewTouchHook = Hooker { 22 | XposedHelpers.findAndHookMethod(CC.View, "onTouchEvent", CC.MotionEvent, object : XC_MethodHook() { 23 | @Throws(Throwable::class) 24 | override fun beforeHookedMethod(param: MethodHookParam) { 25 | val view = param.thisObject as View 26 | val event = param.args[0] as MotionEvent 27 | if (event.action == MotionEvent.ACTION_DOWN) { 28 | // LogUtil.log("===============") 29 | // view.background = ColorDrawable(Color.parseColor("#33333333")) 30 | LogUtil.log("点击操作") 31 | LogUtil.logViewStackTraces(view) 32 | LogUtil.log("-------------------") 33 | if (HookConfig.is_hook_debug2) { 34 | LogUtil.logViewStackTraces(ViewUtils.getParentViewSafe(view, 35)) 35 | } 36 | } 37 | } 38 | }) 39 | val XLogSetup = XposedHelpers.findClass("com.tencent.mm.xlog.app.XLogSetup", WechatGlobal.wxLoader) 40 | XposedBridge.hookAllMethods(XLogSetup, "keep_setupXLog", object : XC_MethodHook() { 41 | override fun beforeHookedMethod(param: MethodHookParam) { 42 | param.args[5] = true 43 | } 44 | }) 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/DiscoverHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.view.View 4 | import com.blanke.mdwechat.Classes 5 | import com.blanke.mdwechat.Fields.PreferenceFragment_mListView 6 | import com.blanke.mdwechat.config.HookConfig 7 | import com.blanke.mdwechat.hookers.base.Hooker 8 | import com.blanke.mdwechat.hookers.base.HookerProvider 9 | import com.blanke.mdwechat.hookers.main.BackgroundImageHook 10 | import com.blanke.mdwechat.util.LogUtil 11 | import de.robv.android.xposed.XC_MethodHook 12 | import de.robv.android.xposed.XposedHelpers 13 | 14 | object DiscoverHooker : HookerProvider { 15 | const val keyInit = "key_init" 16 | 17 | override fun provideStaticHookers(): List? { 18 | return listOf(resumeHook) 19 | } 20 | 21 | private val resumeHook = Hooker { 22 | XposedHelpers.findAndHookMethod(Classes.Fragment, "performResume", object : XC_MethodHook() { 23 | override fun afterHookedMethod(param: MethodHookParam?) { 24 | val fragment = param?.thisObject ?: return 25 | if (fragment.javaClass.name != Classes.DiscoverFragment.name) { 26 | return 27 | } 28 | val isInit = XposedHelpers.getAdditionalInstanceField(fragment, keyInit) 29 | if (isInit != null) { 30 | LogUtil.log("DiscoverFragment 已经hook过") 31 | return 32 | } 33 | XposedHelpers.setAdditionalInstanceField(fragment, keyInit, true) 34 | if (HookConfig.is_hook_tab_bg) { 35 | init(fragment) 36 | } 37 | } 38 | 39 | private fun init(fragment: Any) { 40 | val listView = PreferenceFragment_mListView.get(fragment) 41 | if (listView != null && listView is View) { 42 | // val background = AppCustomConfig.getTabBg(2) 43 | // listView.background = NightModeUtils.getBackgroundDrawable(background) 44 | BackgroundImageHook.setDiscoverBitmap(listView) 45 | } 46 | } 47 | }) 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/LogHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.util.Log 4 | import com.blanke.mdwechat.config.HookConfig 5 | import com.blanke.mdwechat.hookers.base.Hooker 6 | import com.blanke.mdwechat.hookers.base.HookerProvider 7 | import com.blanke.mdwechat.util.LogUtil.exportLog 8 | import de.robv.android.xposed.XC_MethodHook 9 | import de.robv.android.xposed.XposedBridge 10 | 11 | object LogHooker : HookerProvider { 12 | 13 | override fun provideStaticHookers(): List? { 14 | return listOf(LogEHooker) 15 | // return listOf(LogIHooker, LogEHooker) 16 | } 17 | 18 | private val LogIHooker = Hooker { 19 | XposedBridge.hookAllMethods(Log::class.java, "i", object : XC_MethodHook() { 20 | override fun afterHookedMethod(param: MethodHookParam) { 21 | if (!HookConfig.is_hook_log) { 22 | return 23 | } 24 | val msg = param.args[1] as String 25 | if (msg.contains("mdwechat", true)) { 26 | exportLog(msg) 27 | } 28 | } 29 | }) 30 | } 31 | 32 | private val LogEHooker = Hooker { 33 | XposedBridge.hookAllMethods(Log::class.java, "e", object : XC_MethodHook() { 34 | override fun afterHookedMethod(param: MethodHookParam) { 35 | if (!HookConfig.is_hook_log) { 36 | return 37 | } 38 | val msg = param.args[1] as String 39 | if (msg.contains("mdwechat", true)) { 40 | exportLog(msg) 41 | } 42 | val tr = param.args[param.args.size - 1] 43 | if (tr is Throwable) { 44 | val msg1 = Log.getStackTraceString(tr) 45 | if (msg1.contains("mdwechat", true)) { 46 | exportLog(msg1) 47 | } 48 | } 49 | } 50 | }) 51 | } 52 | 53 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/NightModeHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.content.res.Configuration 4 | import android.content.res.Resources 5 | import com.blanke.mdwechat.config.HookConfig 6 | import com.blanke.mdwechat.hookers.base.Hooker 7 | import com.blanke.mdwechat.hookers.base.HookerProvider 8 | import com.blanke.mdwechat.util.NightModeUtils 9 | import de.robv.android.xposed.XC_MethodHook 10 | import de.robv.android.xposed.XposedHelpers 11 | 12 | object NightModeHooker : HookerProvider { 13 | override fun provideStaticHookers(): List? { 14 | return listOf(getNightModeConfiguration) 15 | } 16 | 17 | private val getNightModeConfiguration = Hooker { 18 | XposedHelpers.findAndHookMethod(Resources::class.java, "getConfiguration", object : XC_MethodHook() { 19 | @Throws(Throwable::class) 20 | override fun afterHookedMethod(param: MethodHookParam) { 21 | val configuration = param.result as Configuration 22 | val uiMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK 23 | if (HookConfig.is_hook_scheme_dark) 24 | configuration.uiMode = Configuration.UI_MODE_NIGHT_YES 25 | else { 26 | NightModeUtils.setNightMode(uiMode == Configuration.UI_MODE_NIGHT_YES) 27 | } 28 | } 29 | }) 30 | } 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/SchemeHooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers 2 | 3 | import android.app.Activity 4 | import android.content.Intent 5 | import com.blanke.mdwechat.Classes.RemittanceAdapterUI 6 | import com.blanke.mdwechat.Methods.WXCustomSchemeEntryActivity_entry 7 | import com.blanke.mdwechat.hookers.base.Hooker 8 | import com.blanke.mdwechat.hookers.base.HookerProvider 9 | import de.robv.android.xposed.XC_MethodHook 10 | import de.robv.android.xposed.XposedBridge 11 | 12 | object SchemeHooker : HookerProvider { 13 | override fun provideStaticHookers(): List? { 14 | return listOf(donateHooker) 15 | } 16 | 17 | private val donateHooker = Hooker { 18 | XposedBridge.hookMethod(WXCustomSchemeEntryActivity_entry, object : XC_MethodHook() { 19 | override fun beforeHookedMethod(param: MethodHookParam) { 20 | val intent = param.args[0] as Intent? 21 | val uri = intent?.data ?: return 22 | val activity = param.thisObject as Activity 23 | if (uri.host == "mdwechat") { 24 | val segments = uri.pathSegments 25 | if (segments.firstOrNull() == "donate") { 26 | activity.startActivity(Intent(activity, RemittanceAdapterUI).apply { 27 | putExtra("scene", 1) 28 | putExtra("pay_channel", 12) 29 | putExtra("receiver_name", "wxp://${segments[1]}") 30 | }) 31 | } 32 | param.result = false 33 | } 34 | } 35 | }) 36 | } 37 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/base/Hooker.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers.base 2 | 3 | data class Hooker(val hook: () -> Unit) { 4 | @Volatile var hasHooked = false 5 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/hookers/base/HookerProvider.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.hookers.base 2 | 3 | interface HookerProvider { 4 | fun provideStaticHookers(): List? = null 5 | fun provideEventHooker(event: String): Hooker? = null 6 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/settings/api/APIManager.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.settings.api 2 | 3 | import okhttp3.Callback 4 | import okhttp3.OkHttpClient 5 | import okhttp3.Request 6 | 7 | class APIManager { 8 | private val host = "https://gitee.com/JoshCai/MDWechat/raw/v4.0/" 9 | 10 | private val client: OkHttpClient by lazy { 11 | OkHttpClient.Builder().build() 12 | } 13 | 14 | fun getWechatConfigs(callback: Callback) { 15 | val req = Request.Builder().url("${host}data/config/wechat/data.json") 16 | .get() 17 | .build() 18 | client.newCall(req).enqueue(callback) 19 | } 20 | 21 | fun getNewestVersion(callback: Callback) { 22 | val req = Request.Builder().url("${host}data/newest_version.json") 23 | .get() 24 | .build() 25 | client.newCall(req).enqueue(callback) 26 | } 27 | 28 | fun downloadWechatConfig(url: String, callback: Callback) { 29 | get(url, callback) 30 | } 31 | 32 | fun get(url: String, callback: Callback) { 33 | val req = Request.Builder().url(url) 34 | .get() 35 | .build() 36 | client.newCall(req).enqueue(callback) 37 | } 38 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/settings/bean/NewestVersionConfig.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.settings.bean 2 | 3 | class NewestVersionConfig(val version: String, val versionCode: String, val info: String) -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/settings/bean/WechatConfig.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.settings.bean 2 | 3 | class WechatConfig(val name: String, val desc: String, val url: String) -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/util/BitmapUtil.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.util 2 | 3 | import android.graphics.Bitmap 4 | import android.graphics.Matrix 5 | 6 | object BitmapUtil { 7 | fun scaleImage(source: Bitmap, toWidth: Int, toHeight: Int): Bitmap { 8 | // 计算缩放比例 9 | val scaleWidth = toWidth.toFloat() / source.width 10 | val scaleHeight = toHeight.toFloat() / source.height 11 | // 取得想要缩放的matrix参数 12 | val matrix = Matrix() 13 | matrix.postScale(scaleWidth, scaleHeight) 14 | // 得到新的图片 15 | return Bitmap.createBitmap(source, 0, 0, source.width, source.height, matrix, true) 16 | } 17 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/util/ColorUtils.java: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.util; 2 | 3 | import android.graphics.Bitmap; 4 | import android.graphics.Color; 5 | 6 | /** 7 | * Created by blanke on 2017/10/5. 8 | */ 9 | 10 | public class ColorUtils { 11 | public static int getDarkerColor(int color, float factor) { 12 | float[] hsv = new float[3]; 13 | Color.colorToHSV(color, hsv); 14 | hsv[2] = hsv[2] * factor; 15 | return Color.HSVToColor(hsv); 16 | } 17 | 18 | // // 性能不行 19 | // //图片色阶调整,调整rgb的分量 20 | // public static Bitmap img_color_gradation(Bitmap imgsrc,float factor) { 21 | // try { 22 | // //直接创建一个位图 23 | //// Bitmap back = Bitmap.createBitmap(imgsrc); 24 | // Bitmap back=Bitmap.createBitmap(imgsrc.getWidth(), imgsrc.getHeight(),Bitmap.Config.ARGB_8888); 25 | // 26 | // int width = imgsrc.getWidth(); 27 | // int height = imgsrc.getHeight(); 28 | // for (int i = 0; i < height; i++) { 29 | // for (int j = 0; j < width; j++) { 30 | // int color = imgsrc.getPixel(j, i); 31 | //// int red= color.getRed()+r; if(red>255) red=255; if(red<0) red=0; 32 | //// int green= color.getGreen()+g; if(green>255) green=255; if(green<0) green=0; 33 | //// int blue= color.getBlue()+b; if(blue>255) blue=255; if(blue<0) blue=0; 34 | //// color = new Color(red,green,blue); 35 | // color=getDarkerColor(color,factor); 36 | //// int x=color.getRGB(); 37 | // back.setPixel(j,i,color); 38 | // } 39 | // } 40 | // return back; 41 | // } catch (Exception e) { 42 | // e.printStackTrace(); 43 | // return null; 44 | // } 45 | // } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/util/ConvertUtils.java: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.util; 2 | 3 | import android.content.Context; 4 | 5 | public class ConvertUtils { 6 | /** 7 | * dp转px * * @param dpValue dp值 * @return px值 8 | */ 9 | public static int dp2px(Context context, float dpValue) { 10 | final float scale = context.getApplicationContext().getResources().getDisplayMetrics().density; 11 | return (int) (dpValue * scale + 0.5f); 12 | } 13 | 14 | /** 15 | * px转dp * * @param pxValue px值 * @return dp值 16 | */ 17 | public static int px2dp(Context context, float pxValue) { 18 | final float scale = context.getApplicationContext().getResources().getDisplayMetrics().density; 19 | return (int) (pxValue / scale + 0.5f); 20 | } 21 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/util/KtUtils.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.util 2 | 3 | import android.os.Handler 4 | import android.os.Looper 5 | import kotlin.concurrent.thread 6 | 7 | fun mainThread(delay: Long = 0, run: () -> Unit) { 8 | Handler(Looper.getMainLooper()).postDelayed(run, delay) 9 | } 10 | 11 | fun waitInvoke(checkInterval: Long = 100, mainThread: Boolean = false, check: () -> Boolean, callBack: () -> Unit) { 12 | thread { 13 | while (true) { 14 | Thread.sleep(checkInterval) 15 | var result = false 16 | if (mainThread) { 17 | var end = false 18 | com.blanke.mdwechat.util.mainThread { 19 | result = check() 20 | end = true 21 | } 22 | while (!end) { 23 | Thread.sleep(100) 24 | } 25 | } else { 26 | result = check() 27 | } 28 | if (result) { 29 | if (mainThread) { 30 | com.blanke.mdwechat.util.mainThread { 31 | callBack() 32 | } 33 | } else { 34 | callBack() 35 | } 36 | break 37 | } 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/util/VXPUtils.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.util 2 | 3 | 4 | object VXPUtils { 5 | fun isVXPEnv(): Boolean { 6 | return System.getProperty("vxp") != null 7 | } 8 | } 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/util/ViewTreeUtils.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.util 2 | 3 | import android.view.View 4 | import android.view.ViewGroup 5 | import com.blanke.mdwechat.WechatGlobal 6 | import com.blanke.mdwechat.bean.ViewTree 7 | import com.blanke.mdwechat.bean.ViewTreeItem 8 | 9 | object ViewTreeUtils { 10 | 11 | /** 12 | * 判断 view 的层级结构是否和定义的相等 13 | */ 14 | fun equals(tree: ViewTreeItem, view: View): Boolean { 15 | if (!equals(tree.clazz, view)) { 16 | return false 17 | } 18 | if (view is ViewGroup) { 19 | if (view.childCount >= tree.children.size) { 20 | for (i in 0 until tree.children.size) { 21 | if (tree.children[i] == null) { 22 | continue 23 | } 24 | if (!equals(tree.children[i]!!, view.getChildAt(i))) { 25 | return false 26 | } 27 | } 28 | return true 29 | } 30 | } else { 31 | if (tree.children.isEmpty()) { 32 | return true 33 | } 34 | } 35 | return false 36 | } 37 | 38 | fun equals(clazz: String, view: View): Boolean { 39 | return view.javaClass.name.contains(clazz, true) 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /app/src/main/java/com/blanke/mdwechat/widget/CircleImageView.kt: -------------------------------------------------------------------------------- 1 | package com.blanke.mdwechat.widget 2 | 3 | import android.annotation.TargetApi 4 | import android.content.Context 5 | import android.graphics.Canvas 6 | import android.graphics.Color 7 | import android.graphics.Paint 8 | import android.graphics.Path 9 | import android.os.Build 10 | import android.util.AttributeSet 11 | import android.util.Log 12 | import android.widget.ImageView 13 | 14 | /** 15 | * Created by blanke on 2017/8/1. 16 | */ 17 | 18 | class CircleImageView : ImageView { 19 | private var paint: Paint? = null 20 | internal var path = Path() 21 | 22 | constructor(context: Context) : super(context) {} 23 | 24 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {} 25 | 26 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} 27 | 28 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 29 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { 30 | } 31 | 32 | override fun onDraw(canvas: Canvas) { 33 | if (paint == null) { 34 | paint = Paint() 35 | paint!!.color = Color.RED 36 | // paint.setColor(Color.TRANSPARENT); 37 | // paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); 38 | // path.setFillType(Path.FillType.INVERSE_WINDING); 39 | val w = measuredWidth 40 | val h = measuredHeight 41 | val r = Math.min(w, h) / 2 42 | Log.d("imageview", "r=$r,w=$w,h=$h") 43 | path.addCircle((w / 2).toFloat(), (h / 2).toFloat(), r.toFloat(), Path.Direction.CW) 44 | } 45 | canvas.clipPath(path) 46 | super.onDraw(canvas) 47 | // canvas.drawRect(0, 0, w, h, paint); 48 | // canvas.drawCircle(w / 2, h / 2, r, paint); 49 | // paint.setXfermode(null); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/res/drawable-xxhdpi/ic_add.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/res/drawable-xxhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_clear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/res/drawable-xxhdpi/ic_clear.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/res/drawable-xxhdpi/ic_done.png -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_mark_down.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 17 | 18 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_wechat_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_category.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 25 | 26 | 33 | 34 | 42 | 43 | 44 | 50 | 51 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_hidden.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_info.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 27 | 28 | 36 | 37 | 38 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 24 | 25 | 34 | 35 | 43 | 44 | 45 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/preference_warning.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 24 | 25 | 34 | 35 | 43 | 44 | 45 | 51 | 52 | -------------------------------------------------------------------------------- /app/src/main/res/layout/view_floatbutton.xml: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 21 | 22 | 28 | 29 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/mdwechat_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/app/src/main/res/mipmap-xhdpi/mdwechat_icon.png -------------------------------------------------------------------------------- /app/src/main/res/values/dimen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12sp 4 | 2dp 5 | 48dp 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.3.71' 5 | repositories { 6 | google() 7 | jcenter() 8 | maven { url 'https://jitpack.io' } 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:3.6.2' 12 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 13 | 14 | // NOTE: Do not place your application dependencies here; they belong 15 | // in the individual module build.gradle files 16 | } 17 | } 18 | 19 | allprojects { 20 | repositories { 21 | jcenter() 22 | google() 23 | maven { url 'https://jitpack.io' } 24 | } 25 | } 26 | 27 | task clean(type: Delete) { 28 | delete rootProject.buildDir 29 | } 30 | -------------------------------------------------------------------------------- /data/config/wechat/6.6.6/6.6.6.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.f","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$a","ConversationFragment":"com.tencent.mm.ui.conversation.j","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.h","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.w","MainTabUIPageAdapter":"com.tencent.mm.ui.w$a","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.i","ScrollingTabContainerView":"android.support.v7.widget.ai","SettingsFragment":"com.tencent.mm.ui.y","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.al","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"oiy","ConversationFragment_mListView":"zvG","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"ymR","LauncherUIBottomTabViewItem_mTextViews":["yos","yot"],"LauncherUI_mHomeUI":"ynB","MainTabUI_mCustomViewPager":"yru","PreferenceFragment_mListView":"odm"},"methods":{"AvatarUtils_getAvatarBitmaps":["cx","cy"],"AvatarUtils_getDefaultAvatarBitmap":"uA","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"nx","HomeFragment_lifecycles":["coR","coS","coT","coU","coV","coW"],"LauncherUIBottomTabView_getTabItemView":"Eq","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"a","WXCustomSchemeEntryActivity_entry":"A","WxViewPager_selectedPage":"a"}} -------------------------------------------------------------------------------- /data/config/wechat/6.7.2/6.7.2.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$a","ConversationFragment":"com.tencent.mm.ui.conversation.j","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.h","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.z","MainTabUIPageAdapter":"com.tencent.mm.ui.z$a","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.i","ScrollingTabContainerView":"android.support.v7.widget.ar","SettingsFragment":"com.tencent.mm.ui.ac","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.an","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"kVN","ConversationFragment_mListView":"vgg","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"tXk","LauncherUIBottomTabViewItem_mTextViews":["tYI","tYJ"],"LauncherUI_mHomeUI":"tXR","MainTabUI_mCustomViewPager":"ubL","PreferenceFragment_mListView":"kQL"},"methods":{"AvatarUtils_getAvatarBitmaps":["cj","ck"],"AvatarUtils_getDefaultAvatarBitmap":"sz","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"nb","HomeFragment_lifecycles":["crM","crN","crO","crP","crQ","crR"],"LauncherUIBottomTabView_getTabItemView":"Ey","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"a","WXCustomSchemeEntryActivity_entry":"w","WxViewPager_selectedPage":"a"}} -------------------------------------------------------------------------------- /data/config/wechat/6.7.3-play/6.7.3.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$a","ConversationFragment":"com.tencent.mm.ui.conversation.k","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.h","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.z","MainTabUIPageAdapter":"com.tencent.mm.ui.z$a","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.i","ScrollingTabContainerView":"android.support.v7.widget.aq","SettingsFragment":"com.tencent.mm.ui.ac","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.ao","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"lCe","ConversationFragment_mListView":"vTS","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"uKG","LauncherUIBottomTabViewItem_mTextViews":["uMe","uMf"],"LauncherUI_mHomeUI":"uLn","MainTabUI_mCustomViewPager":"uPg","PreferenceFragment_mListView":"lwY"},"methods":{"AvatarUtils_getAvatarBitmaps":["ch","ci"],"AvatarUtils_getDefaultAvatarBitmap":"sI","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"nH","HomeFragment_lifecycles":["cxS","cxT","cxU","cxV","cxW","cxX"],"LauncherUIBottomTabView_getTabItemView":"FN","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"a","WXCustomSchemeEntryActivity_entry":"w","WxViewPager_selectedPage":"a"}} -------------------------------------------------------------------------------- /data/config/wechat/6.7.3/6.7.3.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$a","ConversationFragment":"com.tencent.mm.ui.conversation.k","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.h","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.z","MainTabUIPageAdapter":"com.tencent.mm.ui.z$a","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.i","ScrollingTabContainerView":"android.support.v7.widget.aq","SettingsFragment":"com.tencent.mm.ui.ac","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.ao","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"lBK","ConversationFragment_mListView":"vTt","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"uKi","LauncherUIBottomTabViewItem_mTextViews":["uLG","uLH"],"LauncherUI_mHomeUI":"uKP","MainTabUI_mCustomViewPager":"uOI","PreferenceFragment_mListView":"lwE"},"methods":{"AvatarUtils_getAvatarBitmaps":["ch","ci"],"AvatarUtils_getDefaultAvatarBitmap":"sG","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"nG","HomeFragment_lifecycles":["cxD","cxE","cxF","cxG","cxH","cxI"],"LauncherUIBottomTabView_getTabItemView":"FM","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"a","WXCustomSchemeEntryActivity_entry":"w","WxViewPager_selectedPage":"a"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.0/7.0.0.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","ScrollingTabContainerView":"android.support.v7.widget.as","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.ar","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"mOV","ConversationFragment_mListView":"yfy","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"wUT","LauncherUIBottomTabViewItem_mTextViews":["wWA","wWB"],"LauncherUI_mHomeUI":"wVJ","MainTabUI_mCustomViewPager":"wQE","PreferenceFragment_mListView":"mJQ"},"methods":{"AvatarUtils_getAvatarBitmaps":["cF","cG"],"AvatarUtils_getDefaultAvatarBitmap":"zd","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"pC","HomeFragment_lifecycles":["diX","diY","diZ","dja","djb","djc"],"LauncherUIBottomTabView_getTabItemView":"Kz","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"L","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.12-play/7.0.12.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"rJE","ConversationFragment_mListView":"FyH","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"EiE","LauncherUI_mHomeUI":"EjE","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fb","fc"],"AvatarUtils_getDefaultAvatarBitmap":"KS","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"uX","HomeFragment_lifecycles":["ezS","ezT","ezU","ezV","ezW","ezX"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"S","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.13-playx64/7.0.13.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"slQ","ConversationFragment_mListView":"GjH","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"ESf","LauncherUI_mHomeUI":"ETe","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fa","fb"],"AvatarUtils_getDefaultAvatarBitmap":"Lf","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"vw","HomeFragment_lifecycles":["eGn","eGo","eGp","eGq","eGr","eGs"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"R","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.13/7.0.13.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"skl","ConversationFragment_mListView":"Ggy","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"EOY","LauncherUI_mHomeUI":"EPX","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["eV","eW"],"AvatarUtils_getDefaultAvatarBitmap":"Lb","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"vt","HomeFragment_lifecycles":["eFA","eFB","eFC","eFx","eFy","eFz"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"S","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.13x64/7.0.13.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"skl","ConversationFragment_mListView":"Ggy","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"EOY","LauncherUI_mHomeUI":"EPX","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["eV","eW"],"AvatarUtils_getDefaultAvatarBitmap":"Lb","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"vt","HomeFragment_lifecycles":["eFA","eFB","eFC","eFx","eFy","eFz"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"S","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.14/7.0.14.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"swF","ConversationFragment_mListView":"GGg","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"FnB","LauncherUI_mHomeUI":"FoA","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["eO","eP"],"AvatarUtils_getDefaultAvatarBitmap":"Lh","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"wd","HomeFragment_lifecycles":["eLA","eLv","eLw","eLx","eLy","eLz"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"S","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.15/7.0.15.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"sMV","ConversationFragment_mListView":"HeP","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"FLc","LauncherUI_mHomeUI":"FMb","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["ew","ex"],"AvatarUtils_getDefaultAvatarBitmap":"Ky","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"wB","HomeFragment_lifecycles":["eOU","eOV","eOW","eOX","eOY","eOZ"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.16/7.0.16.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"tUA","ConversationFragment_mListView":"IFc","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"Hkk","LauncherUI_mHomeUI":"Hlj","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["el","em"],"AvatarUtils_getDefaultAvatarBitmap":"Kj","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"xI","HomeFragment_lifecycles":["feA","feB","feC","feD","fey","fez"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.17-play/7.0.17.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"uFn","ConversationFragment_mListView":"JSr","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"IwD","LauncherUI_mHomeUI":"IxC","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["eo","ep"],"AvatarUtils_getDefaultAvatarBitmap":"KC","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"yg","HomeFragment_lifecycles":["fqB","fqC","fqD","fqE","fqF","fqG"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Y","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.17/7.0.17.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"uyQ","ConversationFragment_mListView":"Jvz","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"HZV","LauncherUI_mHomeUI":"IaU","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["ej","ek"],"AvatarUtils_getDefaultAvatarBitmap":"Kz","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"xX","HomeFragment_lifecycles":["fmq","fmr","fms","fmt","fmu","fmv"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.18/7.0.18.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"uXc","ConversationFragment_mListView":"Kwg","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"IXR","LauncherUI_mHomeUI":"IYQ","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fg","fh"],"AvatarUtils_getDefaultAvatarBitmap":"LL","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"yw","HomeFragment_lifecycles":["fuF","fuG","fuH","fuI","fuJ","fuK"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"ab","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.21-play/7.0.21.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"wxM","ConversationFragment_mListView":"MXP","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"Lwq","LauncherUI_mHomeUI":"Lxp","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fF","fG"],"AvatarUtils_getDefaultAvatarBitmap":"Jy","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"AF","HomeFragment_lifecycles":["fWA","fWB","fWC","fWD","fWE","fWz"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"aa","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.22/7.0.22.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"wHk","ConversationFragment_mListView":"NpN","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"LNH","LauncherUI_mHomeUI":"LOH","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fr","fs"],"AvatarUtils_getDefaultAvatarBitmap":"JN","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"AU","HomeFragment_lifecycles":["fZI","fZJ","fZK","fZL","fZM","fZN"],"HomeUI_setActionBarColor":["a","b"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"ab","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.3/7.0.3.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","ScrollingTabContainerView":"android.support.v7.widget.at","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.ar","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"nfq","ConversationFragment_mListView":"yGr","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"xvn","LauncherUIBottomTabViewItem_mTextViews":["xwY","xwZ"],"LauncherUI_mHomeUI":"xwg","MainTabUI_mCustomViewPager":"xqV","PreferenceFragment_mListView":"naj"},"methods":{"AvatarUtils_getAvatarBitmaps":["cI","cJ"],"AvatarUtils_getDefaultAvatarBitmap":"zO","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"qi","HomeFragment_lifecycles":["dqA","dqB","dqC","dqx","dqy","dqz"],"LauncherUIBottomTabView_getTabItemView":"LP","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"L","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.4/7.0.4.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","ScrollingTabContainerView":"android.support.v7.widget.au","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.aq","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"nIv","ConversationFragment_mListView":"zuW","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"yiP","LauncherUIBottomTabViewItem_mTextViews":["ykB","ykC"],"LauncherUI_mHomeUI":"yjJ","MainTabUI_mCustomViewPager":"yeo","PreferenceFragment_mListView":"nDp"},"methods":{"AvatarUtils_getAvatarBitmaps":["cQ","cR"],"AvatarUtils_getDefaultAvatarBitmap":"AZ","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"qL","HomeFragment_lifecycles":["dvY","dvZ","dwa","dwb","dwc","dwd"],"LauncherUIBottomTabView_getTabItemView":"MW","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"O","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.5/7.0.5.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","ScrollingTabContainerView":"android.support.v7.widget.ar","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.aq","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"nYW","ConversationFragment_mListView":"All","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"yXW","LauncherUIBottomTabViewItem_mTextViews":["yZL","yZM"],"LauncherUI_mHomeUI":"yYT","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["dt","du"],"AvatarUtils_getDefaultAvatarBitmap":"AY","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"rp","HomeFragment_lifecycles":["dAA","dAB","dAC","dAD","dAy","dAz"],"LauncherUIBottomTabView_getTabItemView":"Od","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"O","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.6/7.0.6.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","ScrollingTabContainerView":"android.support.v7.widget.ar","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.aq","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"oCw","ConversationFragment_mListView":"AUL","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"zHX","LauncherUIBottomTabViewItem_mTextViews":["zJM","zJN"],"LauncherUI_mHomeUI":"zIU","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["dW","dX"],"AvatarUtils_getDefaultAvatarBitmap":"Fh","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"rQ","HomeFragment_lifecycles":["dHZ","dIa","dIb","dIc","dId","dIe"],"HomeUI_setActionBarColor":["a","b"],"LauncherUIBottomTabView_getTabItemView":"Pl","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"O","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/7.0.7/7.0.7.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.c","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","LauncherUIBottomTabViewItem":"com.tencent.mm.ui.LauncherUIBottomTabView$a","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","ScrollingTabContainerView":"android.support.v7.widget.ar","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","TabIconView":"com.tencent.mm.ui.TabIconView","ThreadExecutor":"com.tencent.mm.sdk.platformtools.aq","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"pAr","ConversationFragment_mListView":"Cxd","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"BjR","LauncherUIBottomTabViewItem_mTextViews":["BlJ","BlK"],"LauncherUI_mHomeUI":"BkR","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["ep","eq"],"AvatarUtils_getDefaultAvatarBitmap":"Iw","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"st","HomeFragment_lifecycles":["dVG","dVH","dVI","dVJ","dVK","dVL"],"HomeUI_setActionBarColor":["a","b"],"LauncherUIBottomTabView_getTabItemView":"QJ","MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"N","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.0/8.0.0.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"yCT","ConversationFragment_mListView":"QfG","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"OCP","LauncherUI_mHomeUI":"ODR","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fZ","ga"],"AvatarUtils_getDefaultAvatarBitmap":"Wg","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"CA","HomeFragment_lifecycles":["gGu","gGv","gGw","gGx","gGy","gGz"],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"ab","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.1/8.0.1.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"yCT","ConversationFragment_mListView":"QfG","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"OCP","LauncherUI_mHomeUI":"ODR","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["fZ","ga"],"AvatarUtils_getDefaultAvatarBitmap":"Wg","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"CA","HomeFragment_lifecycles":["gGu","gGv","gGw","gGx","gGy","gGz"],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"ab","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.14/8.0.14.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"aaGX","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"YXn","LauncherUI_mHomeUI":"YYr","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["gO","gP"],"AvatarUtils_getDefaultAvatarBitmap":"acn","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.15/8.0.15.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"aaGX","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"YXn","LauncherUI_mHomeUI":"YYr","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["gO","gP"],"AvatarUtils_getDefaultAvatarBitmap":"acn","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.16/8.0.16.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.g","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"aaxJ","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"YNC","LauncherUI_mHomeUI":"YOG","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["hb","hc"],"AvatarUtils_getDefaultAvatarBitmap":"alL","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"aa","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.2/8.0.2.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"android.support.v7.widget.ActionBarContainer","ActionMenuView":"android.support.v7.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","ConversationWithAppBrandListView":"com.tencent.mm.ui.conversation.ConversationWithAppBrandListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"zKq","ConversationFragment_mListView":"RFk","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"QbT","LauncherUI_mHomeUI":"QcX","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["gx","gy"],"AvatarUtils_getDefaultAvatarBitmap":"abs","ConversationWithAppBrandListView_isAppBrandHeaderEnable":"Ef","HomeFragment_lifecycles":["heQ","heR","heS","heT","heU","heV"],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"ad","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.20/8.0.20.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"ahoS","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"afzv","LauncherUI_mHomeUI":"afAz","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["io","loadBitmap"],"AvatarUtils_getDefaultAvatarBitmap":"aHg","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["g","h"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"af","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.24/8.0.24.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"aoeP","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"amjp","LauncherUI_mHomeUI":"amku","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["iz","loadBitmap"],"AvatarUtils_getDefaultAvatarBitmap":"axU","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"ac","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.3/8.0.3.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"AbB","ConversationFragment_mListView":"SqM","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"QMT","LauncherUI_mHomeUI":"QNX","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["gF","gG"],"AvatarUtils_getDefaultAvatarBitmap":"aaR","HomeFragment_lifecycles":["hor","hos","hot","hou","hov","how"],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.31/8.0.31.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.e","AvatarUtils":"com.tencent.mm.app.h","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"o","HomeUI_mActionBar":"c","HomeUI_mMainTabUI":"t","LauncherUI_mHomeUI":"n","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"e"},"methods":{"AvatarUtils_getAvatarBitmaps":["fe","loadBitmap"],"AvatarUtils_getDefaultAvatarBitmap":"B20","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["a","c"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"K7","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.32/8.0.32.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.e","AvatarUtils":"com.tencent.mm.app.g","ContactFragment":"com.blanke.mdwechat.auto_search.ClassNotSupported","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"fieldNotSupported","ConversationFragment_mListView":"o","HomeUI_mActionBar":"c","HomeUI_mMainTabUI":"t","LauncherUI_mHomeUI":"n","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"e"},"methods":{"AvatarUtils_getAvatarBitmaps":["C","loadBitmap"],"AvatarUtils_getDefaultAvatarBitmap":"Rq","HomeFragment_lifecycles":[],"HomeUI_setActionBarColor":["a","c"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"K7","WxViewPager_onLayout":"onLayout","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/config/wechat/8.0.6/8.0.6.config: -------------------------------------------------------------------------------- 1 | {"classes":{"ActionBarContainer":"androidx.appcompat.widget.ActionBarContainer","ActionMenuView":"androidx.appcompat.view.menu.h","AvatarUtils":"com.tencent.mm.app.e","ContactFragment":"com.tencent.mm.ui.contact.AddressUI$AddressUIFragment","ConversationFragment":"com.tencent.mm.ui.conversation.MainUI","ConversationListView":"com.tencent.mm.ui.conversation.ConversationListView","CustomViewPager":"com.tencent.mm.ui.base.CustomViewPager","DiscoverFragment":"com.tencent.mm.ui.FindMoreFriendsUI","HomeUI":"com.tencent.mm.ui.HomeUI","LauncherUI":"com.tencent.mm.ui.LauncherUI","LauncherUIBottomTabView":"com.tencent.mm.ui.LauncherUIBottomTabView","MMFragmentActivity":"com.tencent.mm.ui.MMFragmentActivity","MainTabUI":"com.tencent.mm.ui.MainTabUI","MainTabUIPageAdapter":"com.tencent.mm.ui.MainTabUI$TabsAdapter","NoDrawingCacheLinearLayout":"com.tencent.mm.ui.NoDrawingCacheLinearLayout","NoMeasuredTextView":"com.tencent.mm.ui.base.NoMeasuredTextView","PhoneWindow":"com.android.internal.policy.PhoneWindow","PreferenceFragment":"com.tencent.mm.ui.base.preference.MMPreferenceFragment","SettingsFragment":"com.tencent.mm.ui.MoreTabUI","SnsTimeLineUI":"com.tencent.mm.plugin.sns.ui.SnsTimeLineUI","WXCustomSchemeEntryActivity":"com.tencent.mm.plugin.base.stub.WXCustomSchemeEntryActivity","WxViewPager":"com.tencent.mm.ui.mogic.WxViewPager"},"fields":{"ContactFragment_mListView":"AEI","ConversationFragment_mListView":"Tol","HomeUI_mActionBar":"mActionBar","HomeUI_mMainTabUI":"RJb","LauncherUI_mHomeUI":"RKf","MainTabUI_mCustomViewPager":"mViewPager","PreferenceFragment_mListView":"list"},"methods":{"AvatarUtils_getAvatarBitmaps":["gD","gE"],"AvatarUtils_getDefaultAvatarBitmap":"ack","HomeFragment_lifecycles":["hxA","hxB","hxC","hxD","hxE","hxF"],"HomeUI_setActionBarColor":["f","g"],"MainTabUIPageAdapter_getCount":"getCount","MainTabUIPageAdapter_onPageScrolled":"fixAndroidOProgressBarOutScreenFlashProblem","WXCustomSchemeEntryActivity_entry":"Z","WxViewPager_selectedPage":"setCurrentItemInternal"}} -------------------------------------------------------------------------------- /data/help/bubble.md: -------------------------------------------------------------------------------- 1 | # 气泡教程 2 | 3 | ## 路径 4 | - 左气泡:`/sdcard/mdwechat/icon/bubble_left.9.png` 5 | - 右气泡:`/sdcard/mdwechat/icon/bubble_right.9.png` 6 | 7 | ## 说明 8 | - 替换掉上述文件即可修改。 9 | - 需要.9格式。 10 | - 不会制作的可以使用\[碘酒编辑器]、\[9 Patch Editor]等 -------------------------------------------------------------------------------- /data/help/float_button.md: -------------------------------------------------------------------------------- 1 | # 悬浮按钮定制教程 2 | 3 | ## 路径 4 | `/sdcard/mdwechat/config/view/floatbutton.txt` 5 | 6 | ## 文件说明 7 | 1. 文件采用 json 语法,修改必须遵循该格式,否则解析失败,不会显示。 8 | 入门语法教程:[菜鸟教程](http://www.runoob.com/json/json-tutorial.html) 9 | 2. 字段说明 10 | - order: 顺序,越小越靠上 11 | - type:跳转后的类名 12 | - text:显示名称 13 | - icon:图标名称 14 | 15 | ## icon 说明 16 | 所有图标路径在 `/sdcard/mdwechat/icon/`下,如果不存在该图标,不会显示。 17 | 18 | ## type 说明 19 | type 为跳转后的 Activity 完整类名,可以借助 开发者助手、auto.js等工具查看。 20 | 以下是常见类名: 21 | 22 | 名称 | 类名 23 | ---- | --- 24 | 小程序 | com.tencent.mm.plugin.appbrand.ui.AppBrandLauncherUI 25 | 朋友圈 | com.tencent.mm.plugin.sns.ui.SnsTimeLineUI 26 | 扫一扫 | com.tencent.mm.plugin.scanner.ui.BaseScanUI 27 | 收付款 | com.tencent.mm.plugin.offline.ui.WalletOfflineCoinPurseUI 28 | 钱包 | com.tencent.mm.plugin.mall.ui.MallIndexUI 29 | 收藏 | com.tencent.mm.plugin.fav.ui.FavoriteIndexUI 30 | 群聊 | com.tencent.mm.ui.contact.SelectContactUI 31 | 搜索 | com.tencent.mm.plugin.fts.ui.FTSMainUI 32 | 添加好友 | com.tencent.mm.plugin.subapp.ui.pluginapp.AddMoreFriendsUI 33 | 34 | 特殊 type: 35 | 36 | type | 说明 37 | ---- | --- 38 | weiX | 微x模块 39 | 40 | ## 建议 41 | 如果以上教程看完,还是一脸懵逼,建议你还是放弃吧。 -------------------------------------------------------------------------------- /data/help/icon.md: -------------------------------------------------------------------------------- 1 | # 图标替换教程 2 | ## 路径 3 | `/sdcard/mdwechat/icon/` 4 | ## 修改方法 5 | - 在文件管理器中替换掉上述对应文件即可 6 | - MDWechat 4.0 以上主界面背景图片大小设置为**与手机分辨率相同**即可,无需另外调整分辨率。 7 | ## 文件列表 8 | 9 | 背景图文件名 | 含义 10 | ---- | --- 11 | tab_bg0.png| 主界面聊天页面背景图 12 | tab_bg1.png| 主界面联系人页面背景图 13 | tab_bg2.png| 主界面发现页面背景图 14 | tab_bg3.png| 主界面设置页面背景图 15 | 16 | 其余图标文件名 | 含义 17 | ---- | --- 18 | bubble_left.9.png | 聊天气泡(左) 19 | bubble_right.9.png| 聊天气泡(右) 20 | tab_icon0.png| 主界面聊天页面 tab icon图 21 | tab_icon1.png| 主界面联系人页面 tab icon图 22 | tab_icon2.png| 主界面发现页面 tab icon图 23 | tab_icon3.png| 主界面设置页面 tab icon图 24 | 其余文件| 悬浮按钮 icon 图 25 | ## 参考 26 | ### icon 下载网站参考 27 | - [https://material.io/tools/icons/?style=baseline](https://material.io/tools/icons/?style=baseline) 28 | - [http://www.iconfont.cn/](http://www.iconfont.cn/) -------------------------------------------------------------------------------- /data/help/join_group.md: -------------------------------------------------------------------------------- 1 | - 官方微信群(添加微信 CSYJZF,回复 MDWechat) 2 | - 官方交流群(QQ群:674478488) 3 | - 官方内测群(QQ群:661865449) 4 | - JoshCai的群(QQ群:733219708) -------------------------------------------------------------------------------- /data/newest_version.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4.2.6", 3 | "versionCode": "108", 4 | "info": "- !!!修改聊天气泡的功能暂已失效(对于8.0.27之后的微信版本)!!!\n恢复微信8.0.7之后的自动切换夜间模式\n适配微信8.0.32\n沉浸模式的分辨率设置自动适应全面屏的刘海" 5 | } -------------------------------------------------------------------------------- /fab-lib/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /fab-lib/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 27 5 | 6 | defaultConfig { 7 | minSdkVersion 21 8 | targetSdkVersion 27 9 | versionCode 1 10 | versionName '1.0' 11 | } 12 | buildTypes { 13 | release { 14 | minifyEnabled false 15 | debuggable false 16 | } 17 | 18 | debug { 19 | minifyEnabled false 20 | debuggable true 21 | } 22 | } 23 | } 24 | 25 | dependencies { 26 | } 27 | 28 | -------------------------------------------------------------------------------- /fab-lib/gradle.properties: -------------------------------------------------------------------------------- 1 | POM_NAME=Floating Action Button Library 2 | POM_ARTIFACT_ID=fab 3 | POM_PACKAGING=aar -------------------------------------------------------------------------------- /fab-lib/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /fab-lib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /fab-lib/src/main/java/com/github/clans/fab/Util.java: -------------------------------------------------------------------------------- 1 | package com.github.clans.fab; 2 | 3 | import android.content.Context; 4 | import android.os.Build; 5 | 6 | final class Util { 7 | 8 | private Util() { 9 | } 10 | 11 | static int dpToPx(Context context, float dp) { 12 | final float scale = context.getResources().getDisplayMetrics().density; 13 | return Math.round(dp * scale); 14 | } 15 | 16 | static boolean hasJellyBean() { 17 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN; 18 | } 19 | 20 | static boolean hasLollipop() { 21 | return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/anim/fab_scale_down.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/anim/fab_scale_up.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/anim/fab_slide_in_from_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/anim/fab_slide_in_from_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/anim/fab_slide_out_to_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/anim/fab_slide_out_to_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 8 | 12 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 56dp 5 | 45dp 6 | 14sp 7 | 8 | -------------------------------------------------------------------------------- /fab-lib/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | #org.gradle.jvmargs=-Xmx1536m 13 | 14 | # When configured, Gradle will run in incubating parallel mode. 15 | # This option should only be used with decoupled projects. More details, visit 16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 17 | # org.gradle.parallel=true 18 | android.enableJetifier=true 19 | android.injected.testOnly=false 20 | android.useAndroidX=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Feb 28 19:02:12 CST 2020 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip 7 | -------------------------------------------------------------------------------- /image/chat00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/chat00.png -------------------------------------------------------------------------------- /image/chat01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/chat01.png -------------------------------------------------------------------------------- /image/color_scheme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/color_scheme.png -------------------------------------------------------------------------------- /image/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/demo.gif -------------------------------------------------------------------------------- /image/main00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/main00.png -------------------------------------------------------------------------------- /image/main01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/main01.png -------------------------------------------------------------------------------- /image/main02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/main02.png -------------------------------------------------------------------------------- /image/main03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/main03.png -------------------------------------------------------------------------------- /image/main05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/main05.png -------------------------------------------------------------------------------- /image/res_correct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/res_correct.png -------------------------------------------------------------------------------- /image/res_too_large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/res_too_large.png -------------------------------------------------------------------------------- /image/res_too_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/res_too_small.png -------------------------------------------------------------------------------- /image/res_too_small_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/res_too_small_1.png -------------------------------------------------------------------------------- /image/sample_1080_2340.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoshCai233/MDWechat/7fc55cbbde6420bb58df1e00a8dca7753138b6ca/image/sample_1080_2340.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':fab-lib', ':tablayout-lib', ':ColorPicker', ':takephoto-lib' 2 | -------------------------------------------------------------------------------- /tablayout-lib/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /tablayout-lib/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | version = "2.1.2" 3 | android { 4 | compileSdkVersion 27 5 | 6 | defaultConfig { 7 | minSdkVersion 21 8 | targetSdkVersion 27 9 | versionCode 212 10 | versionName version 11 | } 12 | buildTypes { 13 | release { 14 | minifyEnabled false 15 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 16 | } 17 | } 18 | } 19 | 20 | dependencies { 21 | //noinspection GradleCompatible 22 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 23 | } 24 | -------------------------------------------------------------------------------- /tablayout-lib/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/lihui/work/AndroidStudio/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/java/com/flyco/tablayout/listener/CustomTabEntity.java: -------------------------------------------------------------------------------- 1 | package com.flyco.tablayout.listener; 2 | 3 | import android.graphics.drawable.Drawable; 4 | import androidx.annotation.DrawableRes; 5 | 6 | public interface CustomTabEntity { 7 | String getTabTitle(); 8 | 9 | @DrawableRes 10 | int getTabSelectedIcon(); 11 | 12 | @DrawableRes 13 | int getTabUnselectedIcon(); 14 | 15 | Drawable getTabIcon(); 16 | 17 | 18 | class TabCustomData implements CustomTabEntity { 19 | 20 | @Override 21 | public String getTabTitle() { 22 | return null; 23 | } 24 | 25 | @Override 26 | public int getTabSelectedIcon() { 27 | return 0; 28 | } 29 | 30 | @Override 31 | public int getTabUnselectedIcon() { 32 | return 0; 33 | } 34 | 35 | @Override 36 | public Drawable getTabIcon() { 37 | return null; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /tablayout-lib/src/main/java/com/flyco/tablayout/listener/OnTabSelectListener.java: -------------------------------------------------------------------------------- 1 | package com.flyco.tablayout.listener; 2 | 3 | public interface OnTabSelectListener { 4 | void onTabSelect(int position); 5 | void onTabReselect(int position); 6 | } -------------------------------------------------------------------------------- /tablayout-lib/src/main/java/com/flyco/tablayout/utils/FragmentChangeManager.java: -------------------------------------------------------------------------------- 1 | package com.flyco.tablayout.utils; 2 | 3 | import androidx.fragment.app.Fragment; 4 | import androidx.fragment.app.FragmentManager; 5 | import androidx.fragment.app.FragmentTransaction; 6 | 7 | import java.util.ArrayList; 8 | 9 | public class FragmentChangeManager { 10 | private FragmentManager mFragmentManager; 11 | private int mContainerViewId; 12 | /** Fragment切换数组 */ 13 | private ArrayList mFragments; 14 | /** 当前选中的Tab */ 15 | private int mCurrentTab; 16 | 17 | public FragmentChangeManager(FragmentManager fm, int containerViewId, ArrayList fragments) { 18 | this.mFragmentManager = fm; 19 | this.mContainerViewId = containerViewId; 20 | this.mFragments = fragments; 21 | initFragments(); 22 | } 23 | 24 | /** 初始化fragments */ 25 | private void initFragments() { 26 | for (Fragment fragment : mFragments) { 27 | mFragmentManager.beginTransaction().add(mContainerViewId, fragment).hide(fragment).commit(); 28 | } 29 | 30 | setFragments(0); 31 | } 32 | 33 | /** 界面切换控制 */ 34 | public void setFragments(int index) { 35 | for (int i = 0; i < mFragments.size(); i++) { 36 | FragmentTransaction ft = mFragmentManager.beginTransaction(); 37 | Fragment fragment = mFragments.get(i); 38 | if (i == index) { 39 | ft.show(fragment); 40 | } else { 41 | ft.hide(fragment); 42 | } 43 | ft.commit(); 44 | } 45 | mCurrentTab = index; 46 | } 47 | 48 | public int getCurrentTab() { 49 | return mCurrentTab; 50 | } 51 | 52 | public Fragment getCurrentFragment() { 53 | return mFragments.get(mCurrentTab); 54 | } 55 | } -------------------------------------------------------------------------------- /tablayout-lib/src/main/java/com/flyco/tablayout/utils/UnreadMsgUtils.java: -------------------------------------------------------------------------------- 1 | package com.flyco.tablayout.utils; 2 | 3 | 4 | import android.util.DisplayMetrics; 5 | import android.view.View; 6 | import android.widget.RelativeLayout; 7 | 8 | import com.flyco.tablayout.widget.MsgView; 9 | 10 | /** 11 | * 未读消息提示View,显示小红点或者带有数字的红点: 12 | * 数字一位,圆 13 | * 数字两位,圆角矩形,圆角是高度的一半 14 | * 数字超过两位,显示99+ 15 | */ 16 | public class UnreadMsgUtils { 17 | public static void show(MsgView msgView, int num) { 18 | if (msgView == null) { 19 | return; 20 | } 21 | RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) msgView.getLayoutParams(); 22 | DisplayMetrics dm = msgView.getResources().getDisplayMetrics(); 23 | if (num == 0) { 24 | msgView.setVisibility(View.GONE); 25 | } else if (num < 0) {//圆点,设置默认宽高 26 | msgView.setVisibility(View.VISIBLE); 27 | msgView.setStrokeWidth(0); 28 | msgView.setText(""); 29 | 30 | lp.width = (int) (10 * dm.density); 31 | lp.height = (int) (10 * dm.density); 32 | msgView.setLayoutParams(lp); 33 | } else { 34 | msgView.setVisibility(View.VISIBLE); 35 | lp.height = (int) (18 * dm.density); 36 | if (num > 0 && num < 10) {//圆 37 | lp.width = (int) (18 * dm.density); 38 | msgView.setText(num + ""); 39 | } else if (num > 9 && num < 100) {//圆角矩形,圆角是高度的一半,设置默认padding 40 | lp.width = RelativeLayout.LayoutParams.WRAP_CONTENT; 41 | msgView.setPadding((int) (6 * dm.density), 0, (int) (6 * dm.density), 0); 42 | msgView.setText(num + ""); 43 | } else {//数字超过两位,显示99+ 44 | lp.width = RelativeLayout.LayoutParams.WRAP_CONTENT; 45 | msgView.setPadding((int) (6 * dm.density), 0, (int) (6 * dm.density), 0); 46 | msgView.setText("99+"); 47 | } 48 | msgView.setLayoutParams(lp); 49 | } 50 | } 51 | 52 | public static void setSize(MsgView rtv, int size) { 53 | if (rtv == null) { 54 | return; 55 | } 56 | RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) rtv.getLayoutParams(); 57 | lp.width = size; 58 | lp.height = size; 59 | rtv.setLayoutParams(lp); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/drawable/shape_unread.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/layout/layout_tab.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 30 | 31 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/layout/layout_tab_bottom.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 22 | 23 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/layout/layout_tab_left.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 20 | 21 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/layout/layout_tab_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 21 | 22 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/layout/layout_tab_segment.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 16 | 17 | 22 | 23 | 24 | 38 | 39 | -------------------------------------------------------------------------------- /tablayout-lib/src/main/res/layout/layout_tab_top.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 23 | 24 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /takephoto-lib/.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Android template 3 | # Built application files 4 | *.apk 5 | *.ap_ 6 | 7 | # Files for the Dalvik VM 8 | *.dex 9 | 10 | # Java class files 11 | *.class 12 | 13 | # Generated files 14 | bin/ 15 | gen/ 16 | 17 | # Gradle files 18 | .gradle/ 19 | build/ 20 | /*/build/ 21 | 22 | # Local configuration file (sdk path, etc) 23 | local.properties 24 | 25 | # Proguard folder generated by Eclipse 26 | proguard/ 27 | 28 | # Log Files 29 | *.log 30 | 31 | 32 | ### JetBrains template 33 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion 34 | 35 | *.iml 36 | 37 | ## Directory-based project format: 38 | .idea/ 39 | # if you remove the above rule, at least ignore the following: 40 | 41 | # User-specific stuff: 42 | # .idea/workspace.xml 43 | # .idea/tasks.xml 44 | # .idea/dictionaries 45 | 46 | # Sensitive or high-churn files: 47 | # .idea/dataSources.ids 48 | # .idea/dataSources.xml 49 | # .idea/sqlDataSources.xml 50 | # .idea/dynamic.xml 51 | # .idea/uiDesigner.xml 52 | 53 | # Gradle: 54 | # .idea/gradle.xml 55 | # .idea/libraries 56 | 57 | # Mongo Explorer plugin: 58 | # .idea/mongoSettings.xml 59 | 60 | ## File-based project format: 61 | *.ipr 62 | *.iws 63 | 64 | ## Plugin-specific files: 65 | 66 | # IntelliJ 67 | /out/ 68 | 69 | # mpeltonen/sbt-idea plugin 70 | .idea_modules/ 71 | 72 | # JIRA plugin 73 | atlassian-ide-plugin.xml 74 | 75 | # Crashlytics plugin (for Android Studio and IntelliJ) 76 | com_crashlytics_export_strings.xml 77 | crashlytics.properties 78 | crashlytics-build.properties 79 | 80 | 81 | ### Gradle template 82 | .gradle 83 | 84 | # Ignore Gradle GUI config 85 | gradle-app.setting 86 | 87 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 88 | !gradle-wrapper.jar 89 | bintrayUpload.gradle 90 | 91 | 92 | -------------------------------------------------------------------------------- /takephoto-lib/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 27 5 | buildToolsVersion '26.0.3' 6 | 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 27 10 | versionCode 45 11 | versionName "4.1.0" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | api fileTree(include: ['*.jar'], dir: 'libs') 23 | api 'com.soundcloud.android.crop:lib_crop:1.0.0' 24 | api 'com.darsh.multipleimageselect:multipleimageselect:1.0.5' 25 | api 'me.shaohui.advancedluban:library:1.3.2' 26 | } 27 | //apply from: "bintrayUpload.gradle" -------------------------------------------------------------------------------- /takephoto-lib/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\Program Files\adt-bundle-windows-x86_64-20140702\sdk1/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | 20 | -dontwarn android.support.** 21 | -keep class android.support.** { *; } 22 | 23 | 24 | -keepattributes InnerClasses 25 | -dontoptimize 26 | 27 | 28 | -keep class com.jph.takephoto.** { *; } 29 | -dontwarn com.jph.takephoto.** 30 | 31 | -keep class com.darsh.multipleimageselect.** { *; } 32 | -dontwarn com.darsh.multipleimageselect.** 33 | 34 | -keep class com.soundcloud.android.crop.** { *; } 35 | -dontwarn com.soundcloud.android.crop.** 36 | 37 | -------------------------------------------------------------------------------- /takephoto-lib/src/androidTest/java/org/devio/takephoto/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /takephoto-lib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/compress/CompressImage.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.compress; 2 | 3 | import org.devio.takephoto.model.TImage; 4 | 5 | import java.util.ArrayList; 6 | 7 | /** 8 | * 压缩照片2.0 9 | *

10 | * Author JPH 11 | * Date 2015-08-26 下午1:44:26 12 | */ 13 | public interface CompressImage { 14 | void compress(); 15 | 16 | /** 17 | * 压缩结果监听器 18 | */ 19 | interface CompressListener { 20 | /** 21 | * 压缩成功 22 | * 23 | * @param images 已经压缩图片 24 | */ 25 | void onCompressSuccess(ArrayList images); 26 | 27 | /** 28 | * 压缩失败 29 | * 30 | * @param images 压缩失败的图片 31 | * @param msg 失败的原因 32 | */ 33 | void onCompressFailed(ArrayList images, String msg); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/InvokeParam.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import java.lang.reflect.Method; 4 | 5 | /** 6 | * Created by penn on 16/9/22. 7 | */ 8 | public class InvokeParam { 9 | private Object proxy; 10 | private Method method; 11 | private Object[] args; 12 | 13 | public InvokeParam(Object proxy, Method method, Object[] args) { 14 | this.proxy = proxy; 15 | this.method = method; 16 | this.args = args; 17 | } 18 | 19 | public Object getProxy() { 20 | return proxy; 21 | } 22 | 23 | public void setProxy(Object proxy) { 24 | this.proxy = proxy; 25 | } 26 | 27 | public Method getMethod() { 28 | return method; 29 | } 30 | 31 | public void setMethod(Method method) { 32 | this.method = method; 33 | } 34 | 35 | public Object[] getArgs() { 36 | return args; 37 | } 38 | 39 | public void setArgs(Object[] args) { 40 | this.args = args; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/LubanOptions.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Luban配置类 7 | * Author: crazycodeboy 8 | * Date: 2016/11/5 0007 20:10 9 | * Version:4.0.1 10 | * 技术博文:http://www.devio.org/ 11 | * GitHub:https://github.com/crazycodeboy 12 | * Email:crazycodeboy@gmail.com 13 | */ 14 | public class LubanOptions implements Serializable { 15 | /** 16 | * 压缩到的最大大小,单位B 17 | */ 18 | private int maxSize; 19 | private int maxHeight; 20 | private int maxWidth; 21 | 22 | private LubanOptions() { 23 | } 24 | 25 | public int getMaxSize() { 26 | return maxSize; 27 | } 28 | 29 | public void setMaxSize(int maxSize) { 30 | this.maxSize = maxSize; 31 | } 32 | 33 | public int getMaxHeight() { 34 | return maxHeight; 35 | } 36 | 37 | public void setMaxHeight(int maxHeight) { 38 | this.maxHeight = maxHeight; 39 | } 40 | 41 | public int getMaxWidth() { 42 | return maxWidth; 43 | } 44 | 45 | public void setMaxWidth(int maxWidth) { 46 | this.maxWidth = maxWidth; 47 | } 48 | 49 | public static class Builder { 50 | private LubanOptions options; 51 | 52 | public Builder() { 53 | options = new LubanOptions(); 54 | } 55 | 56 | public Builder setMaxSize(int maxSize) { 57 | options.setMaxSize(maxSize); 58 | return this; 59 | } 60 | 61 | public Builder setMaxHeight(int maxHeight) { 62 | options.setMaxHeight(maxHeight); 63 | return this; 64 | } 65 | 66 | public Builder setMaxWidth(int maxWidth) { 67 | options.setMaxWidth(maxWidth); 68 | return this; 69 | } 70 | 71 | public LubanOptions create() { 72 | return options; 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TContextWrap.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import android.app.Activity; 4 | import android.preference.PreferenceFragment; 5 | import androidx.fragment.app.Fragment; 6 | 7 | /** 8 | * Author: JPH 9 | * Date: 2016/8/11 17:01 10 | */ 11 | public class TContextWrap { 12 | private Activity activity; 13 | private Fragment fragment; 14 | private PreferenceFragment preferenceFragment; 15 | 16 | private TContextWrap(Activity activity) { 17 | this.activity = activity; 18 | } 19 | 20 | private TContextWrap(Fragment fragment) { 21 | this.fragment = fragment; 22 | this.activity = fragment.getActivity(); 23 | } 24 | 25 | private TContextWrap(PreferenceFragment fragment) { 26 | this.preferenceFragment = fragment; 27 | this.activity = fragment.getActivity(); 28 | } 29 | 30 | public static TContextWrap of(Activity activity) { 31 | return new TContextWrap(activity); 32 | } 33 | 34 | public static TContextWrap of(Fragment fragment) { 35 | return new TContextWrap(fragment); 36 | } 37 | 38 | public static TContextWrap of(PreferenceFragment fragment) { 39 | return new TContextWrap(fragment); 40 | } 41 | 42 | public Activity getActivity() { 43 | return activity; 44 | } 45 | 46 | public void setActivity(Activity activity) { 47 | this.activity = activity; 48 | } 49 | 50 | public Fragment getFragment() { 51 | return fragment; 52 | } 53 | 54 | public PreferenceFragment getPreferenceFragment() { 55 | return preferenceFragment; 56 | } 57 | 58 | public void setFragment(Fragment fragment) { 59 | this.fragment = fragment; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TException.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | /** 4 | * Author: JPH 5 | * Date: 2016/7/26 10:53 6 | */ 7 | public class TException extends Exception { 8 | String detailMessage; 9 | 10 | public TException(TExceptionType exceptionType) { 11 | super(exceptionType.getStringValue()); 12 | this.detailMessage = exceptionType.getStringValue(); 13 | } 14 | 15 | public String getDetailMessage() { 16 | return detailMessage; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TExceptionType.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | /** 4 | * Author: JPH 5 | * Date: 2016/7/26 11:01 6 | */ 7 | public enum TExceptionType { 8 | TYPE_NOT_IMAGE("选择的文件不是图片"), TYPE_WRITE_FAIL("保存选择的的文件失败"), TYPE_URI_NULL("所选照片的Uri 为null"), TYPE_URI_PARSE_FAIL("从Uri中获取文件路径失败"), 9 | TYPE_NO_MATCH_PICK_INTENT("没有匹配到选择图片的Intent"), TYPE_NO_MATCH_CROP_INTENT("没有匹配到裁切图片的Intent"), TYPE_NO_CAMERA("没有相机"), 10 | TYPE_NO_FIND("选择的文件没有找到"); 11 | 12 | String stringValue; 13 | 14 | TExceptionType(String stringValue) { 15 | this.stringValue = stringValue; 16 | } 17 | 18 | public String getStringValue() { 19 | return stringValue; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TImage.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import android.net.Uri; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * TakePhoto 操作成功返回的处理结果 9 | *

10 | * Author: JPH 11 | * Date: 2016/8/11 17:01 12 | */ 13 | public class TImage implements Serializable { 14 | private String originalPath; 15 | private String compressPath; 16 | private FromType fromType; 17 | private boolean cropped; 18 | private boolean compressed; 19 | 20 | private TImage(String path, FromType fromType) { 21 | this.originalPath = path; 22 | this.fromType = fromType; 23 | } 24 | 25 | private TImage(Uri uri, FromType fromType) { 26 | this.originalPath = uri.getPath(); 27 | this.fromType = fromType; 28 | } 29 | 30 | public static TImage of(String path, FromType fromType) { 31 | return new TImage(path, fromType); 32 | } 33 | 34 | public static TImage of(Uri uri, FromType fromType) { 35 | return new TImage(uri, fromType); 36 | } 37 | 38 | public String getOriginalPath() { 39 | return originalPath; 40 | } 41 | 42 | public void setOriginalPath(String originalPath) { 43 | this.originalPath = originalPath; 44 | } 45 | 46 | public String getCompressPath() { 47 | return compressPath; 48 | } 49 | 50 | public void setCompressPath(String compressPath) { 51 | this.compressPath = compressPath; 52 | } 53 | 54 | public FromType getFromType() { 55 | return fromType; 56 | } 57 | 58 | public void setFromType(FromType fromType) { 59 | this.fromType = fromType; 60 | } 61 | 62 | public boolean isCropped() { 63 | return cropped; 64 | } 65 | 66 | public void setCropped(boolean cropped) { 67 | this.cropped = cropped; 68 | } 69 | 70 | public boolean isCompressed() { 71 | return compressed; 72 | } 73 | 74 | public void setCompressed(boolean compressed) { 75 | this.compressed = compressed; 76 | } 77 | 78 | public enum FromType { 79 | CAMERA, OTHER 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TIntentWap.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import android.content.Intent; 4 | 5 | /** 6 | * Author: JPH 7 | * Date: 2016/7/26 14:23 8 | */ 9 | public class TIntentWap { 10 | private Intent intent; 11 | private int requestCode; 12 | 13 | public TIntentWap() { 14 | } 15 | 16 | public TIntentWap(Intent intent, int requestCode) { 17 | this.intent = intent; 18 | this.requestCode = requestCode; 19 | } 20 | 21 | public Intent getIntent() { 22 | return intent; 23 | } 24 | 25 | public void setIntent(Intent intent) { 26 | this.intent = intent; 27 | } 28 | 29 | public int getRequestCode() { 30 | return requestCode; 31 | } 32 | 33 | public void setRequestCode(int requestCode) { 34 | this.requestCode = requestCode; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TResult.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import java.util.ArrayList; 4 | 5 | /** 6 | * TakePhoto 操作成功返回的处理结果 7 | * Author: JPH 8 | * Date: 2016/8/11 17:01 9 | */ 10 | public class TResult { 11 | private ArrayList images; 12 | private TImage image; 13 | 14 | private TResult(ArrayList images) { 15 | this.images = images; 16 | if (images != null && !images.isEmpty()) { 17 | this.image = images.get(0); 18 | } 19 | } 20 | 21 | public static TResult of(TImage image) { 22 | ArrayList images = new ArrayList<>(1); 23 | images.add(image); 24 | return new TResult(images); 25 | } 26 | 27 | public static TResult of(ArrayList images) { 28 | return new TResult(images); 29 | } 30 | 31 | public ArrayList getImages() { 32 | return images; 33 | } 34 | 35 | public void setImages(ArrayList images) { 36 | this.images = images; 37 | } 38 | 39 | public TImage getImage() { 40 | return image; 41 | } 42 | 43 | public void setImage(TImage image) { 44 | this.image = image; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/model/TakePhotoOptions.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.model; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * Author: crazycodeboy 7 | * Date: 2016/11/5 0007 20:10 8 | * Version:4.0.0 9 | * 技术博文:http://www.devio.org/ 10 | * GitHub:https://github.com/crazycodeboy 11 | * Email:crazycodeboy@gmail.com 12 | */ 13 | public class TakePhotoOptions implements Serializable { 14 | /** 15 | * 是否使用TakePhoto自带的相册进行图片选择,默认不使用,但选择多张图片会使用 16 | */ 17 | private boolean withOwnGallery; 18 | /** 19 | * 是对拍的照片进行旋转角度纠正 20 | */ 21 | private boolean correctImage; 22 | 23 | private TakePhotoOptions() { 24 | } 25 | 26 | public boolean isWithOwnGallery() { 27 | return withOwnGallery; 28 | } 29 | 30 | public void setWithOwnGallery(boolean withOwnGallery) { 31 | this.withOwnGallery = withOwnGallery; 32 | } 33 | 34 | public boolean isCorrectImage() { 35 | return correctImage; 36 | } 37 | 38 | public void setCorrectImage(boolean correctImage) { 39 | this.correctImage = correctImage; 40 | } 41 | 42 | public static class Builder { 43 | private TakePhotoOptions options; 44 | 45 | public Builder() { 46 | this.options = new TakePhotoOptions(); 47 | } 48 | 49 | public Builder setWithOwnGallery(boolean withOwnGallery) { 50 | options.setWithOwnGallery(withOwnGallery); 51 | return this; 52 | } 53 | 54 | public Builder setCorrectImage(boolean isCorrectImage) { 55 | options.setCorrectImage(isCorrectImage); 56 | return this; 57 | } 58 | 59 | public TakePhotoOptions create() { 60 | return options; 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/permission/InvokeListener.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.permission; 2 | 3 | import org.devio.takephoto.model.InvokeParam; 4 | 5 | /** 6 | * 授权管理回调 7 | */ 8 | public interface InvokeListener { 9 | PermissionManager.TPermissionType invoke(InvokeParam invokeParam); 10 | } 11 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/permission/TakePhotoInvocationHandler.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.permission; 2 | 3 | import org.devio.takephoto.app.TakePhoto; 4 | import org.devio.takephoto.model.InvokeParam; 5 | 6 | import java.lang.reflect.InvocationHandler; 7 | import java.lang.reflect.Method; 8 | import java.lang.reflect.Proxy; 9 | 10 | public class TakePhotoInvocationHandler implements InvocationHandler { 11 | private TakePhoto delegate; 12 | private InvokeListener listener; 13 | 14 | private TakePhotoInvocationHandler(InvokeListener listener) { 15 | this.listener = listener; 16 | } 17 | 18 | public static TakePhotoInvocationHandler of(InvokeListener listener) { 19 | return new TakePhotoInvocationHandler(listener); 20 | } 21 | 22 | /** 23 | * 绑定委托对象并返回一个代理类 24 | * 25 | * @param delegate 26 | * @return 27 | */ 28 | public Object bind(TakePhoto delegate) { 29 | this.delegate = delegate; 30 | return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this); 31 | } 32 | 33 | @Override 34 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 35 | PermissionManager.TPermissionType type = listener.invoke(new InvokeParam(proxy, method, args)); 36 | if (proxy instanceof TakePhoto) { 37 | if (!PermissionManager.TPermissionType.NOT_NEED.equals(type)) { 38 | ((TakePhoto) proxy).permissionNotify(type); 39 | } 40 | } 41 | return method.invoke(delegate, args); 42 | } 43 | } -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/uitl/TConstant.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.uitl; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 常量类 7 | * 8 | * @author JPH 9 | * Date 2016/6/7 0007 9:39 10 | */ 11 | public class TConstant { 12 | 13 | 14 | /** 15 | * request Code 裁剪照片 16 | **/ 17 | public final static int RC_CROP = 1001; 18 | /** 19 | * request Code 从相机获取照片并裁剪 20 | **/ 21 | public final static int RC_PICK_PICTURE_FROM_CAPTURE_CROP = 1002; 22 | /** 23 | * request Code 从相机获取照片不裁剪 24 | **/ 25 | public final static int RC_PICK_PICTURE_FROM_CAPTURE = 1003; 26 | /** 27 | * request Code 从文件中选择照片 28 | **/ 29 | public final static int RC_PICK_PICTURE_FROM_DOCUMENTS_ORIGINAL = 1004; 30 | /** 31 | * request Code 从文件中选择照片并裁剪 32 | **/ 33 | public final static int RC_PICK_PICTURE_FROM_DOCUMENTS_CROP = 1005; 34 | /** 35 | * request Code 从相册选择照 36 | **/ 37 | public final static int RC_PICK_PICTURE_FROM_GALLERY_ORIGINAL = 1006; 38 | /** 39 | * request Code 从相册选择照片并裁剪 40 | **/ 41 | public final static int RC_PICK_PICTURE_FROM_GALLERY_CROP = 1007; 42 | /** 43 | * request Code 选择多张照片 44 | **/ 45 | public final static int RC_PICK_MULTIPLE = 1008; 46 | 47 | 48 | /** 49 | * requestCode 请求权限 50 | **/ 51 | public final static int PERMISSION_REQUEST_TAKE_PHOTO = 2000; 52 | 53 | public final static String getFileProviderName(Context context) { 54 | return context.getPackageName() + ".fileprovider"; 55 | } 56 | } -------------------------------------------------------------------------------- /takephoto-lib/src/main/java/org/devio/takephoto/uitl/TFileUtils.java: -------------------------------------------------------------------------------- 1 | package org.devio.takephoto.uitl; 2 | 3 | import android.content.Context; 4 | import android.util.Log; 5 | 6 | import java.io.File; 7 | 8 | /** 9 | * Author: crazycodeboy 10 | * Date: 2016/11/5 0007 20:10 11 | * Version:4.0.0 12 | * 技术博文:http://www.devio.org/ 13 | * GitHub:https://github.com/crazycodeboy 14 | * Email:crazycodeboy@gmail.com 15 | */ 16 | public class TFileUtils { 17 | private static final String TAG = "TFileUtils"; 18 | private static String DEFAULT_DISK_CACHE_DIR = "takephoto_cache"; 19 | 20 | public static File getPhotoCacheDir(Context context, File file) { 21 | File cacheDir = context.getCacheDir(); 22 | if (cacheDir != null) { 23 | File mCacheDir = new File(cacheDir, DEFAULT_DISK_CACHE_DIR); 24 | if (!mCacheDir.mkdirs() && (!mCacheDir.exists() || !mCacheDir.isDirectory())) { 25 | return file; 26 | } else { 27 | return new File(mCacheDir, file.getName()); 28 | } 29 | } 30 | if (Log.isLoggable(TAG, Log.ERROR)) { 31 | Log.e(TAG, "default disk cache dir is null"); 32 | } 33 | return file; 34 | } 35 | 36 | public static void delete(String path) { 37 | try { 38 | if (path == null) { 39 | return; 40 | } 41 | File file = new File(path); 42 | if (!file.delete()) { 43 | file.deleteOnExit(); 44 | } 45 | } catch (Exception e) { 46 | e.printStackTrace(); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/res/values-en/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Choose not pictures 4 | No camera 5 | Tips 6 | Being compressed... 7 | "%1$s Picture compression failure:%2$s picturePath:%3$s" 8 | "There are pictures of crop failures." 9 | "There are pictures of compress failures." 10 | " canceled crop" 11 | "Operation canceled." 12 | No permission to use the camera, open the rights management 13 | No permission to use the SD card, open the rights management 14 | No permission to use the camera and SD card, open the rights management 15 | 16 | 17 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 选择的不是图片 4 | 没有相机 5 | 提示 6 | 正在压缩照片... 7 | "%1$s 图片压缩失败:%2$s picturePath:%3$s" 8 | "有裁切失败的图片" 9 | "有压缩失败的图片" 10 | " 取消裁切" 11 | "操作被取消" 12 | 没有使用相机的权限,请在权限管理中开启 13 | 没有使用SD卡的权限,请在权限管理中开启 14 | 没有使用相机和SD卡的权限,请在权限管理中开启 15 | 16 | 17 | 选择图片 18 | 单击选择 19 | 20 | 确定 21 | 已选 22 | 最多能选 %d 张 23 | 24 | 25 | -------------------------------------------------------------------------------- /takephoto-lib/src/main/res/xml/file_paths.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | --------------------------------------------------------------------------------