From b5b12c3e83d6317796b734348c66c4d3b6da6b11 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Mon, 14 Oct 2024 09:42:27 +0800 Subject: [PATCH] =?UTF-8?q?version:1.2.9=20fix:=E4=BF=AE=E5=A4=8D=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=BE=AE=E4=BF=A1=E6=97=B6=E6=89=93=E5=BC=80=E6=8A=A5?= =?UTF-8?q?=E9=94=99=20update:=E6=96=B0=E5=A2=9E=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E8=81=94=E7=B3=BB=E4=BA=BA=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 10 +- app/src/main/AndroidManifest.xml | 10 + .../contact/AddWechatContactActivity.java | 20 +- .../os/activity/contact/ContactActivity.java | 219 ++++++++++++++++++ .../os/activity/contact/ContactViewModel.java | 143 ++++++++++++ .../com/xxpatx/os/adapter/ContactAdapter.java | 4 +- .../xxpatx/os/adapter/DailyAppAdapter.java | 12 +- .../os/adapter/WechatContactAdapter.java | 2 + .../java/com/xxpatx/os/bean/DesktopIcon.java | 4 +- .../com/xxpatx/os/config/MyGlideModule.java | 130 +++++++++++ .../os/fragment/app/AppListFragment.java | 6 +- .../com/xxpatx/os/manager/AppManager.java | 5 + .../xxpatx/os/manager/AppStatusManager.java | 9 +- .../os/service/WeAccessibilityService.java | 6 +- .../java/com/xxpatx/os/utils/ApkUtils.java | 11 +- .../com/xxpatx/os/utils/GlideLoadUtils.java | 24 +- .../main/java/com/xxpatx/os/utils/Utils.java | 18 ++ .../drawable-hdpi/com_android_contacts.png | Bin 24482 -> 12915 bytes .../layout/activity_add_wechat_contact.xml | 24 +- app/src/main/res/layout/activity_contact.xml | 120 ++++++++++ .../main/res/layout/activity_flashlight.xml | 3 +- app/src/main/res/layout/fragment_contact.xml | 2 - 22 files changed, 744 insertions(+), 38 deletions(-) create mode 100644 app/src/main/java/com/xxpatx/os/activity/contact/ContactActivity.java create mode 100644 app/src/main/java/com/xxpatx/os/activity/contact/ContactViewModel.java create mode 100644 app/src/main/java/com/xxpatx/os/config/MyGlideModule.java create mode 100644 app/src/main/res/layout/activity_contact.xml diff --git a/app/build.gradle b/app/build.gradle index f1aa4c5..dd5936e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.xxpatx.os" minSdkVersion 24 targetSdkVersion 29 - versionCode 1028 - versionName "1.2.7" + versionCode 1030 + versionName "1.2.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -148,8 +148,10 @@ dependencies { //磁盘缓存 implementation 'com.jakewharton:disklrucache:2.0.2' //glide - implementation 'com.github.bumptech.glide:glide:4.13.1' - annotationProcessor 'com.github.bumptech.glide:compiler:4.13.1' + implementation 'com.github.bumptech.glide:glide:4.15.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' + implementation 'com.github.bumptech.glide:okhttp3-integration:4.15.1' + //RxJava // implementation 'io.reactivex.rxjava2:rxjava:2.2.12' // implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2131752..c76d78d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -154,6 +154,11 @@ android:name=".activity.setting.SettingActivity" android:launchMode="singleTask" android:screenOrientation="portrait" /> + + + \ No newline at end of file diff --git a/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java b/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java index 0f67a61..14e63a6 100644 --- a/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java @@ -27,6 +27,7 @@ import com.xxpatx.os.custom.GlideEngine; import com.xxpatx.os.databinding.ActivityAddWechatContactBinding; import com.xxpatx.os.db.ContactCacheUtils; import com.xxpatx.os.utils.ScreenUtil; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; import java.io.File; import java.util.ArrayList; @@ -35,17 +36,17 @@ public class AddWechatContactActivity extends BaseMvvmActivity() { @Override public void onResult(ArrayList result) { - mPictrueFilePath = result.get(0).getRealPath(); - File file = new File(mPictrueFilePath); + mViewModel.avatarFilePath = result.get(0).getRealPath(); + File file = new File(mViewModel.avatarFilePath); if (file.exists()) { RequestOptions options = new RequestOptions().transform(new RoundedCorners(ScreenUtil.dip2px(AddWechatContactActivity.this, 8F))); Glide.with(mViewDataBinding.nvAvatar).load(file).apply(options).into(mViewDataBinding.nvAvatar); } else { - mPictrueFilePath = ""; + mViewModel.avatarFilePath = ""; } } diff --git a/app/src/main/java/com/xxpatx/os/activity/contact/ContactActivity.java b/app/src/main/java/com/xxpatx/os/activity/contact/ContactActivity.java new file mode 100644 index 0000000..87f3f73 --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/activity/contact/ContactActivity.java @@ -0,0 +1,219 @@ +package com.xxpatx.os.activity.contact; + +import android.content.ContentResolver; +import android.content.Intent; +import android.database.Cursor; +import android.net.Uri; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.Window; + +import androidx.lifecycle.Observer; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.hjq.toast.Toaster; +import com.tencent.mmkv.MMKV; +import com.xxpatx.os.R; +import com.xxpatx.os.adapter.ContactAdapter; +import com.xxpatx.os.adapter.WechatContactAdapter; +import com.xxpatx.os.base.mvvm.BaseMvvmActivity; +import com.xxpatx.os.bean.BaseResponse; +import com.xxpatx.os.bean.Contact; +import com.xxpatx.os.config.CommonConfig; +import com.xxpatx.os.databinding.ActivityContactBinding; +import com.xxpatx.os.dialog.EditContactDialog; +import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; + +import java.util.ArrayList; +import java.util.List; + +public class ContactActivity extends BaseMvvmActivity { + private static final String TAG = "ContactActivity"; + + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + private ContactAdapter mContactAdapter; + + @Override + protected int getLayoutId() { + return R.layout.activity_contact; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setVDBinding(mViewDataBinding); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + UltimateBarX.addStatusBarTopPadding(mViewDataBinding.clExit); + UltimateBarX.addNavigationBarBottomPadding(mViewDataBinding.clBottom); + + mContactAdapter = new ContactAdapter(); + mContactAdapter.setOnLongClick(new WechatContactAdapter.OnLongClick() { + @Override + public void setOnLongClickListener(Contact contact) { + boolean disableModify = mMMKV.decodeBool(CommonConfig.DISABLE_CONTACT_MODIFY, false); + if (disableModify) { + Toaster.showLong("已禁用联系人修改"); + } else { + if (contact.isSimContact()) { + Toaster.showLong("本地联系人不支持修改"); + } else { + showDialog(contact); + } + } + } + }); + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ContactActivity.this); + linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); + mViewDataBinding.rvContact.setLayoutManager(linearLayoutManager); +// if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { +// mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(mContext, 3)); +// } else { +// mViewDataBinding.rvContact.setLayoutManager(new GridLayoutManager(mContext, 2)); +// } + mViewDataBinding.rvContact.setAdapter(mContactAdapter); + } + + @Override + protected void initData() { + mViewModel.getContactListData().observe(this, new Observer>() { + @Override + public void onChanged(List contacts) { + List sim = getSIMContacts(); + if (sim.size() != 0) { + contacts.addAll(sim); + } + mContactAdapter.setContactList(contacts); + } + }); + + mViewModel.getDeleteData().observe(this, new Observer() { + @Override + public void onChanged(BaseResponse baseResponse) { + if (baseResponse.code == 200) { + Toaster.show("删除成功"); + } else { + Toaster.show("删除失败:" + baseResponse.msg); + } + mViewModel.getContact(); + } + }); + mViewModel.getCacheContact(); + } + + @Override + public void onResume() { + super.onResume(); + Log.e(TAG, "onResume: "); + mViewModel.getCacheContact(); + } + + + public static final String NAME = "name"; + public static final String NUMBER = "number"; + + private List getSIMContacts() { + getAll(); + List contactList = new ArrayList<>(); + ContentResolver resolver = getContentResolver(); + // 获取Sims卡联系人 + Uri uri = Uri.parse("content://icc/adn"); + Cursor phoneCursor = resolver.query(uri, null, null, null, null); + if (phoneCursor != null) { + int colName = phoneCursor.getColumnIndex(NAME); + int colNumber = phoneCursor.getColumnIndex(NUMBER); + while (phoneCursor.moveToNext()) { + String number = phoneCursor.getString(colNumber); + // 当手机号码为空的或者为空字段 跳过当前循环 + String username = phoneCursor.getString(colName); + long id = phoneCursor.getLong(phoneCursor.getColumnIndex("_id")); + Log.e(TAG, "getSIMContacts: number = " + number + " username = " + username + " _id = " + id); + Contact contact = new Contact(username, number, true); + contact.setId(id); + contactList.add(contact); + } + phoneCursor.close(); + } + return contactList; + } + + private void getAll() { + ContentResolver resolver = getContentResolver(); + Cursor adnCursor = resolver.query(Uri.parse("content://icc/adn/subId/0"), null, null, null, null); + for (String columnName : adnCursor.getColumnNames()) { + Log.d("CursorFields: adnCursor ", columnName); + } + Cursor rawContactsCursor = resolver.query(Uri.parse("content://com.android.contacts/raw_contacts"), null, null, null, null); + for (String columnName : rawContactsCursor.getColumnNames()) { + Log.d("CursorFields: rawContactsCursor ", columnName); + } + Cursor dataCursor = resolver.query(Uri.parse("content://com.android.contacts/data"), null, null, null, null); + for (String columnName : dataCursor.getColumnNames()) { + Log.d("CursorFields: dataCursor ", columnName); + } + } + + private EditContactDialog mEditContactDialog; + + private void showDialog(Contact contact) { + if (mEditContactDialog == null) { + mEditContactDialog = new EditContactDialog(ContactActivity.this); + } + if (contact.isSimContact()) { + mEditContactDialog.setHideDelete(true); + } else { + mEditContactDialog.setHideDelete(false); + } + mEditContactDialog + .setPhoneNumber(contact.getMobile()) + .setOnClickBottomListener(new EditContactDialog.OnClickBottomListener() { + @Override + public void onEditClick() { + Intent intent = new Intent(ContactActivity.this, EditContactActivity.class); + intent.putExtra("Contact", contact); + startActivity(intent); + mEditContactDialog.dismiss(); + } + + @Override + public void onDeleteClick() { + if (contact.isSimContact()) { +// deleteSimContact(contact.getId()); + } else { + mViewModel.deleteContact(contact); + } + mEditContactDialog.dismiss(); + } + + @Override + public void onCancelClick() { + mEditContactDialog.dismiss(); + } + }); + Window window = mEditContactDialog.getWindow(); + window.setGravity(Gravity.BOTTOM); + mEditContactDialog.show(); + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + + public void add(View view) { + boolean disableModify = mMMKV.decodeBool(CommonConfig.DISABLE_CONTACT_MODIFY, false); + if (disableModify) { + Toaster.showLong("已禁用联系人修改"); + } else { + Intent intent = new Intent(ContactActivity.this, AddWechatContactActivity.class); + startActivity(intent); + } + } + } +} diff --git a/app/src/main/java/com/xxpatx/os/activity/contact/ContactViewModel.java b/app/src/main/java/com/xxpatx/os/activity/contact/ContactViewModel.java new file mode 100644 index 0000000..6e0a4e6 --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/activity/contact/ContactViewModel.java @@ -0,0 +1,143 @@ +package com.xxpatx.os.activity.contact; + +import android.text.TextUtils; +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.xxpatx.os.base.mvvm.BaseViewModel; +import com.xxpatx.os.bean.BaseResponse; +import com.xxpatx.os.bean.Contact; +import com.xxpatx.os.config.CommonConfig; +import com.xxpatx.os.databinding.ActivityContactBinding; +import com.xxpatx.os.gson.GsonUtils; +import com.xxpatx.os.network.NetInterfaceManager; +import com.xxpatx.os.network.UrlAddress; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class ContactViewModel extends BaseViewModel { + private static final String TAG = "ContactViewModel"; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); + + @Override + public ActivityContactBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + + private MutableLiveData> mContactListData = new MutableLiveData<>(); + + public MutableLiveData> getContactListData() { + return mContactListData; + } + + public void getCacheContact() { + String jsonString = mMMKV.getString(UrlAddress.GET_MAIL_LIST, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + if (!TextUtils.isEmpty(jsonString)) { + List contacts = gson.fromJson(jsonString, type); + if (contacts != null) { + mContactListData.setValue(contacts); + } + } + getContact(); + } + + public void getContact() { + NetInterfaceManager.getInstance() + .getContactListObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getContactList", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getContactList", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(listBaseResponse.data)); + mContactListData.setValue(listBaseResponse.data); + } else { + mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); + mContactListData.setValue(new ArrayList<>()); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getContactList", "onError: " + e.getMessage()); + String jsonString = mMMKV.getString(UrlAddress.GET_MAIL_LIST, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + List contacts = gson.fromJson(jsonString, type); + if (contacts == null) { + mContactListData.setValue(new ArrayList<>()); + } else { + mContactListData.setValue(contacts); + } + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getContactList", "onComplete: "); + } + }); + } + + private MutableLiveData mDeleteData = new MutableLiveData<>(); + + public MutableLiveData getDeleteData() { + return mDeleteData; + } + + public void deleteContact(Contact contact) { + Log.e(TAG, "deleteContact: " + contact.getId()); + NetInterfaceManager.getInstance().getMailListDeleteObservable(contact.getId()) + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("deleteContact", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("deleteContact", "onNext: " + baseResponse); + mDeleteData.setValue(baseResponse); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("deleteContact", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("deleteContact", "onComplete: "); + } + }); + + } +} diff --git a/app/src/main/java/com/xxpatx/os/adapter/ContactAdapter.java b/app/src/main/java/com/xxpatx/os/adapter/ContactAdapter.java index 63438eb..2fcbf4d 100644 --- a/app/src/main/java/com/xxpatx/os/adapter/ContactAdapter.java +++ b/app/src/main/java/com/xxpatx/os/adapter/ContactAdapter.java @@ -22,6 +22,7 @@ import com.xxpatx.os.R; import com.xxpatx.os.activity.contact.AddWechatContactActivity; import com.xxpatx.os.activity.selectnumber.SelectNumberActivity; import com.xxpatx.os.bean.Contact; +import com.xxpatx.os.utils.GlideLoadUtils; import com.xxpatx.os.utils.Utils; import java.util.List; @@ -133,7 +134,8 @@ public class ContactAdapter extends RecyclerView.Adapter + * 这里不开启,避免添加相同的modules两次 + * + * @return + */ + @Override + public boolean isManifestParsingEnabled() { + return false; + } + + + @Override + public void registerComponents(Context context, Glide glide, Registry registry) { + //设置请求方式为okhttp 并设置okhttpClient的证书及超时时间 + OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(UnsafeOkHttpClient.getUnsafeOkHttpClient()); + registry.replace(GlideUrl.class, InputStream.class, factory); + } + + //自定义工具类修改OkHttpClient证书和超时时间 + static class UnsafeOkHttpClient { + public static OkHttpClient getUnsafeOkHttpClient() { + try { + // Create a trust manager that does not validate certificate chains + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + } + }; + + // Install the all-trusting trust manager + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + + // Create an ssl socket factory with our all-trusting manager + final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); + builder.hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }); + + builder.connectTimeout(20, TimeUnit.SECONDS); + builder.readTimeout(20, TimeUnit.SECONDS); + builder.writeTimeout(20, TimeUnit.SECONDS); + + OkHttpClient okHttpClient = builder.build(); + return okHttpClient; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + /** + * 禁止解析Manifest文件 + * 主要针对V3升级到v4的用户,可以提升初始化速度,避免一些潜在错误 + * @return + */ + /* @Override + public boolean isManifestParsingEnabled() { + return false; + }*/ + } + +} + diff --git a/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java b/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java index 1402e06..e1abefe 100644 --- a/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java +++ b/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java @@ -27,6 +27,7 @@ import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.FragmentEvent; import com.xxpatx.os.BuildConfig; import com.xxpatx.os.R; +import com.xxpatx.os.activity.contact.ContactActivity; import com.xxpatx.os.activity.dailyapp.DailyAppActivity; import com.xxpatx.os.activity.screenlock.ScreenLockActivity; import com.xxpatx.os.activity.service.ServiceActivity; @@ -252,9 +253,12 @@ public class AppListFragment extends BaseFragment { return; } switch (desktopIcon.getPackage()) { - case "xxpatx.os.service": + case AppManager.SERVICE_PACKAGE: startActivity(new Intent(mContext, ServiceActivity.class)); break; + case AppManager.CONTACT_PACKAGE: + startActivity(new Intent(mContext, ContactActivity.class)); + break; case "aios.daily.app": startActivity(new Intent(mContext, DailyAppActivity.class)); break; diff --git a/app/src/main/java/com/xxpatx/os/manager/AppManager.java b/app/src/main/java/com/xxpatx/os/manager/AppManager.java index 171e593..aaabab7 100644 --- a/app/src/main/java/com/xxpatx/os/manager/AppManager.java +++ b/app/src/main/java/com/xxpatx/os/manager/AppManager.java @@ -32,6 +32,11 @@ public class AppManager { private static final String SHOW_PACKAGE_KEY = "SHOW_PACKAGE_KEY"; private static final String ADD_PACKAGE_KEY = "ADD_PACKAGE_KEY"; + /*客服中心 自定义包名*/ + public static final String SERVICE_PACKAGE = "xxpatx.os.service"; + /*联系人 自定义包名*/ + public static final String CONTACT_PACKAGE = "xxpatx.os.contact"; + @SuppressLint("StaticFieldLeak") private static AppManager sInstance; private Context mContext; diff --git a/app/src/main/java/com/xxpatx/os/manager/AppStatusManager.java b/app/src/main/java/com/xxpatx/os/manager/AppStatusManager.java index 4004835..588708d 100644 --- a/app/src/main/java/com/xxpatx/os/manager/AppStatusManager.java +++ b/app/src/main/java/com/xxpatx/os/manager/AppStatusManager.java @@ -120,8 +120,13 @@ public class AppStatusManager { dailyAppBeanList.add(appSelectBean); } } - if (hidedAppSet.contains("xxpatx.os.service")) { - DailyAppBean serviceIcon = new DailyAppBean("客服中心", "xxpatx.os.service"); + if (hidedAppSet.contains(AppManager.CONTACT_PACKAGE)) { + DailyAppBean contactIcon = new DailyAppBean("联系人", AppManager.CONTACT_PACKAGE); + dailyAppBeanList.add(0, contactIcon); + } + + if (hidedAppSet.contains(AppManager.SERVICE_PACKAGE)) { + DailyAppBean serviceIcon = new DailyAppBean("客服中心", AppManager.SERVICE_PACKAGE); dailyAppBeanList.add(0, serviceIcon); } diff --git a/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java b/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java index a5bbbfa..4d8ae9e 100644 --- a/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java +++ b/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java @@ -203,7 +203,11 @@ public class WeAccessibilityService extends AccessibilityService { intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.setComponent(cmp); - startActivity(intent); + try { + startActivity(intent); + } catch (Exception e) { + Log.e(TAG, "launchWeChat: " + e.getMessage()); + } } private boolean step(Property type, String text, Step nextStep) { diff --git a/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java b/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java index 5f2a173..da53a4a 100644 --- a/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java +++ b/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java @@ -431,13 +431,20 @@ public class ApkUtils { } } - if (!AppStatusManager.getInstance().getHidedAppSet().contains("xxpatx.os.service")) { + if (!AppStatusManager.getInstance().getHidedAppSet().contains(AppManager.SERVICE_PACKAGE)) { DesktopIcon dailyIcon = new DesktopIcon(); dailyIcon.setTitle("客服中心"); - dailyIcon.setPackage("xxpatx.os.service"); + dailyIcon.setPackage(AppManager.SERVICE_PACKAGE); desktopIcons.add(0, dailyIcon); } + if (!AppStatusManager.getInstance().getHidedAppSet().contains(AppManager.CONTACT_PACKAGE)) { + DesktopIcon contactIcon = new DesktopIcon(); + contactIcon.setTitle("联系人"); + contactIcon.setPackage(AppManager.CONTACT_PACKAGE); + desktopIcons.add(1, contactIcon); + } + List shortcutPkgInfos = ShortcutUtils.getInstance().getShortcutList(); desktopIcons.addAll(shortcutPkgInfos); diff --git a/app/src/main/java/com/xxpatx/os/utils/GlideLoadUtils.java b/app/src/main/java/com/xxpatx/os/utils/GlideLoadUtils.java index c7cd996..ad0ecfd 100644 --- a/app/src/main/java/com/xxpatx/os/utils/GlideLoadUtils.java +++ b/app/src/main/java/com/xxpatx/os/utils/GlideLoadUtils.java @@ -3,13 +3,19 @@ package com.xxpatx.os.utils; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; +import android.graphics.drawable.Drawable; import android.os.Build; import android.util.Log; import android.widget.ImageView; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.target.Target; import java.io.File; @@ -41,13 +47,25 @@ public class GlideLoadUtils { * Glide 加载 简单判空封装 防止异步加载数据时调用Glide 抛出异常 * * @param context - * @param url 加载图片的url地址 String - * @param imageView 加载图片的ImageView 控件 + * @param url 加载图片的url地址 String + * @param imageView 加载图片的ImageView 控件 * @param defaultImage 图片展示错误的本地图片 id */ public void glideLoad(Context context, String url, ImageView imageView, int defaultImage) { if (context != null) { - Glide.with(context).load(url).error(defaultImage).into(imageView); + Glide.with(context).load(url).listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + Log.e(TAG, "onLoadFailed: " + e.getMessage()); + Log.e(TAG, "onLoadFailed: " + url); + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + return false; + } + }).error(defaultImage).into(imageView); } else { Log.i(TAG, "Picture loading failed,context is null"); } diff --git a/app/src/main/java/com/xxpatx/os/utils/Utils.java b/app/src/main/java/com/xxpatx/os/utils/Utils.java index a554fe4..6a9ee8b 100644 --- a/app/src/main/java/com/xxpatx/os/utils/Utils.java +++ b/app/src/main/java/com/xxpatx/os/utils/Utils.java @@ -366,4 +366,22 @@ public class Utils { String meid = telephonyManager.getDeviceId(); return meid; } + + public static String getCacheDir(Context context) { + String cachePath; + if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) + || !Environment.isExternalStorageRemovable()) { + if (context.getExternalCacheDir() != null) { + cachePath = context.getExternalCacheDir().getPath(); + } else if (context.getExternalFilesDir("cache") != null) { + cachePath = context.getExternalFilesDir("cache").getPath(); + } else { + cachePath = context.getCacheDir().getPath(); + } + } else { + cachePath = context.getCacheDir().getPath(); + } + return cachePath; + } + } diff --git a/app/src/main/res/drawable-hdpi/com_android_contacts.png b/app/src/main/res/drawable-hdpi/com_android_contacts.png index 04fddf18d0353de9db349e732e6e5f3e5296cceb..b588d854b5546ae0475250665d809191327a1439 100644 GIT binary patch literal 12915 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 - + app:layout_constraintBottom_toTopOf="@+id/cl_bottom" + app:layout_constraintTop_toBottomOf="@+id/cl_exit" + tools:layout_editor_absoluteX="16dp"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_contact.xml b/app/src/main/res/layout/activity_contact.xml new file mode 100644 index 0000000..37c3107 --- /dev/null +++ b/app/src/main/res/layout/activity_contact.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_flashlight.xml b/app/src/main/res/layout/activity_flashlight.xml index 6b1463b..26d71d8 100644 --- a/app/src/main/res/layout/activity_flashlight.xml +++ b/app/src/main/res/layout/activity_flashlight.xml @@ -24,7 +24,7 @@ android:id="@+id/iv_back" android:layout_width="24dp" android:layout_height="24dp" - android:layout_marginStart="16dp" + android:layout_marginStart="8dp" android:adjustViewBounds="true" android:scaleType="centerCrop" android:src="@drawable/back_white" @@ -88,5 +88,6 @@ android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_contact.xml b/app/src/main/res/layout/fragment_contact.xml index ba43821..3f8ed23 100644 --- a/app/src/main/res/layout/fragment_contact.xml +++ b/app/src/main/res/layout/fragment_contact.xml @@ -77,8 +77,6 @@ android:id="@+id/rv_contact" android:layout_width="match_parent" android:layout_height="0dp" - android:layout_marginStart="12dp" - android:layout_marginEnd="12dp" tools:listitem="@layout/item_contact" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"