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"