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 04fddf1..b588d85 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_contacts.png and b/app/src/main/res/drawable-hdpi/com_android_contacts.png differ diff --git a/app/src/main/res/layout/activity_add_wechat_contact.xml b/app/src/main/res/layout/activity_add_wechat_contact.xml index f540035..20e9fdf 100644 --- a/app/src/main/res/layout/activity_add_wechat_contact.xml +++ b/app/src/main/res/layout/activity_add_wechat_contact.xml @@ -17,9 +17,9 @@ android:background="#FAF8F8"> - + 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"