diff --git a/app/build.gradle b/app/build.gradle index bb346c2..ade7b1b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' def appName() { - return "XiaoxintongOS" + return "QinQingOS" } def releaseTime() { @@ -16,8 +16,8 @@ android { minSdkVersion 24 targetSdkVersion 29 - versionCode 201 - versionName "2.0.0" + versionCode 207 + versionName "2.0.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6de01da..563d615 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -196,6 +196,7 @@ contactList) { + mContactListData.setValue(contactList); + } + + @Override + public void onComplete() { + + } + }); + NetInterfaceManager.getInstance() - .getContactListObservable() - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) - .subscribe(new Observer>>() { + .getContactList(getLifecycle(), new NetInterfaceManager.ContactCallback() { @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(); + public void setContact(List contactList) { + mContactListData.setValue(contactList); } @Override public void onComplete() { - Log.e("getContactList", "onComplete: "); + } }); } @@ -125,6 +106,9 @@ public class ContactListViewModel extends BaseViewModel transition) { mPictrueFilePath = FileUtil.bitmapToFile(EditContactActivity.this, resource, "avatar").getAbsolutePath(); + mViewDataBinding.nvAvatar.setImageBitmap(resource); Log.e(TAG, "onResourceReady: " + mPictrueFilePath); } }); diff --git a/app/src/main/java/com/vscool/os/activity/emergency/EmergencyActivity.java b/app/src/main/java/com/vscool/os/activity/emergency/EmergencyActivity.java index 94c7e02..ed432f5 100644 --- a/app/src/main/java/com/vscool/os/activity/emergency/EmergencyActivity.java +++ b/app/src/main/java/com/vscool/os/activity/emergency/EmergencyActivity.java @@ -130,12 +130,6 @@ public class EmergencyActivity extends BaseMvvmActivity { private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); @@ -44,70 +29,30 @@ public class EmergencyViewModel extends BaseViewModel> mContactListData = new MutableLiveData<>(); - public void getCacheContact() { - String jsonString = mMMKV.getString(CommonConfig.EMERGENCY_CONTACT_LIST_KEY, 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().getContactListObserverCache(CommonConfig.EMERGENCY_CONTACT_LIST_KEY, new NetInterfaceManager.ContactCallback() { + @Override + public void setContact(List contactList) { + mContactListData.setValue(contactList); + } + + @Override + public void onComplete() { + + } + }); + NetInterfaceManager.getInstance() - .getContactListObservable() - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) - .subscribe(new Observer>>() { + .getContactList(getLifecycle(), new NetInterfaceManager.ContactCallback() { @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) { - List contactList = listBaseResponse.data; - if (contactList != null && !contactList.isEmpty()) { - List emergencyConcacts = contactList.stream().filter(new Predicate() { - @Override - public boolean test(Contact contact) { - return contact.getIs_urgent() == 1; - } - }).collect(Collectors.toList()); - mMMKV.putString(CommonConfig.EMERGENCY_CONTACT_LIST_KEY, GsonUtils.toJSONString(emergencyConcacts)); - mContactListData.setValue(emergencyConcacts); - } - } else { - mMMKV.putString(CommonConfig.EMERGENCY_CONTACT_LIST_KEY, ""); - mContactListData.setValue(new ArrayList<>()); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("getContactList", "onError: " + e.getMessage()); - String jsonString = mMMKV.getString(CommonConfig.EMERGENCY_CONTACT_LIST_KEY, 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(); + public void setContact(List contactList) { + List emergencyConcacts = contactList.stream().filter(contact -> contact.getIs_urgent() == 1).collect(Collectors.toList()); + mContactListData.setValue(emergencyConcacts); } @Override public void onComplete() { - Log.e("getContactList", "onComplete: "); + } }); } diff --git a/app/src/main/java/com/vscool/os/activity/main/MainActivity.java b/app/src/main/java/com/vscool/os/activity/main/MainActivity.java index bed26ff..6bf315a 100644 --- a/app/src/main/java/com/vscool/os/activity/main/MainActivity.java +++ b/app/src/main/java/com/vscool/os/activity/main/MainActivity.java @@ -11,6 +11,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.content.res.Resources; import android.database.Cursor; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CameraCharacteristics; @@ -93,13 +94,19 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import me.jessyan.autosize.AutoSizeCompat; +import me.jessyan.autosize.AutoSizeConfig; + import static com.arialyy.aria.core.inf.IEntity.STATE_RUNNING; public class MainActivity extends BaseMvvmActivity implements NetworkUtils.OnNetworkStatusChangedListener, - NotificationService.NotificationListener, TextToSpeech.OnInitListener { + NotificationService.NotificationListener, TextToSpeech.OnInitListener +// , CustomAdapt +{ private static final String TAG = "MainActivity"; + private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); private FragmentManager mFragmentManager; @@ -127,6 +134,32 @@ public class MainActivity extends BaseMvvmActivity height); + return super.getResources(); + } + @Override public void onDisconnected() { Log.e(TAG, "onDisconnected: "); diff --git a/app/src/main/java/com/vscool/os/activity/main/MainViewModel.java b/app/src/main/java/com/vscool/os/activity/main/MainViewModel.java index f79379f..b740025 100644 --- a/app/src/main/java/com/vscool/os/activity/main/MainViewModel.java +++ b/app/src/main/java/com/vscool/os/activity/main/MainViewModel.java @@ -397,7 +397,8 @@ public class MainViewModel extends BaseViewModel contactList = ContactCacheUtils.getInstance().getDatabaseContact(); - if (contactList == null || contactList.size() == 0) { + Log.e(TAG, "uploadContacts: " + contactList.size()); + if (contactList.size() == 0) { Log.e(TAG, "uploadContacts: not found local contacts"); } else { for (Contact contact : contactList) { diff --git a/app/src/main/java/com/vscool/os/activity/noti/NoticeInfoActivity.java b/app/src/main/java/com/vscool/os/activity/noti/NoticeInfoActivity.java index d775e58..6a1db95 100644 --- a/app/src/main/java/com/vscool/os/activity/noti/NoticeInfoActivity.java +++ b/app/src/main/java/com/vscool/os/activity/noti/NoticeInfoActivity.java @@ -231,7 +231,7 @@ public class NoticeInfoActivity extends BaseMvvmActivity implements NetworkUtils.OnNetworkStatusChangedListener { private static final String TAG = "WeatherActivity"; - - private WeatherDayApdapterPort mWeatherDayApdapter; + private WeatherDayApdapter mWeatherDayApdapter; private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); - private List options1Items = new ArrayList<>(); - private ArrayList> options2Items = new ArrayList<>(); - private ArrayList>> options3Items = new ArrayList<>(); - private boolean mLoaded = false; - private ActivityResultLauncher register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() { @Override @@ -115,44 +103,40 @@ public class WeatherActivity extends BaseMvvmActivity() { -// @Override -// public void onChanged(MapGeoResult mapGeoResult) { -// if (mapGeoResult != null) { -// mMMKV.encode(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, mapGeoResult.getLocation().toString()); -// mViewModel.getWeather(mapGeoResult.getLocation().toString()); -// } else { -// Toaster.show("获取位置信息失败"); -// } -// } -// }); mViewModel.mQweatherLocationData.observe(this, new Observer() { @Override public void onChanged(QweatherLocation qweatherLocation) { @@ -163,19 +147,21 @@ public class WeatherActivity extends BaseMvvmActivity() { @Override public void onChanged(String s) { mViewDataBinding.tvLocation.setText(s); - Toaster.show("刷新成功"); mViewModel.cityLookup(s); } }); mViewModel.mWeatherNowData.observe(this, new Observer() { @Override public void onChanged(WeatherNowBean weatherNowBean) { + mViewDataBinding.swipeRefreshLayout.setRefreshing(false); + //先判断返回的status是否正确,当status正确时获取数据,若status不正确,可查看status对应的Code值找到原因 if (weatherNowBean != null) { if (Code.OK == weatherNowBean.getCode()) { @@ -197,21 +183,21 @@ public class WeatherActivity extends BaseMvvmActivity() { @Override public void onChanged(WeatherDailyBean weatherDailyBean) { + mViewDataBinding.swipeRefreshLayout.setRefreshing(false); + if (weatherDailyBean != null) { mWeatherDayApdapter.setDailyBeans(weatherDailyBean.getDaily()); WeatherDailyBean.DailyBean dailyBean = weatherDailyBean.getDaily().get(0); - mViewDataBinding.tvMinMax.setText(dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); +// mViewDataBinding.tvMinMax.setText(dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); } } }); -// mViewModel.loadProvince(); getWeather(); } private void getWeather() { -// mViewModel.getWeatherCache(); String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, CommonConfig.DEFAULT_LOCATION_DISTRICT); String tude = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_TUDE, CommonConfig.DEFAULT_LOCATION_TUDE); if (TextUtils.isEmpty(tude)) { @@ -243,11 +229,7 @@ public class WeatherActivity extends BaseMvvmActivity mGeoResultData = new MutableLiveData<>(); - - @Deprecated - public void decodeGeo(String address) { - Log.e(TAG, "decodeGeo: " + address); -// NetInterfaceManager.getInstance().getGeoObservable(address) -// .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) -// .subscribe(new Observer() { -// @Override -// public void onSubscribe(@NonNull Disposable d) { -// Log.e("decodeGeo", "onSubscribe: "); -// } -// -// @Override -// public void onNext(@NonNull BaiduMapGeoBean baiduMapGeoBean) { -// Log.e("decodeGeo", "onNext: " + baiduMapGeoBean); -// if (baiduMapGeoBean.getStatus() == 0) { -// mGeoResultData.setValue(baiduMapGeoBean.getResult()); -// } else { -// mGeoResultData.setValue(null); -// } -// } -// -// @Override -// public void onError(@NonNull Throwable e) { -// Log.e("decodeGeo", "onError: " + e.getMessage()); -// mGeoResultData.setValue(null); -// onComplete(); -// } -// -// @Override -// public void onComplete() { -// Log.e("decodeGeo", "onComplete: "); -// } -// }); - - } - public MutableLiveData mQweatherLocationData = new MutableLiveData<>(); public void cityLookup(String city) { @@ -124,29 +83,6 @@ public class WeatherViewModel extends BaseViewModel() { - }.getType(); - try { - WeatherNowBean weatherNowBean = new Gson().fromJson(nowJsonString, nowType); - mWeatherNowData.setValue(weatherNowBean); - } catch (Exception e) { - Log.e(TAG, "getWeatherCache: now = " + e.getMessage()); - } - - String jsonString = mMMKV.decodeString(CommonConfig.WEATHER_DAILY_KEY, ""); - Type type = new TypeToken() { - }.getType(); - try { - WeatherDailyBean weatherDailyBean = new Gson().fromJson(jsonString, type); - mWeatherDailyData.setValue(weatherDailyBean); - } catch (Exception e) { - Log.e(TAG, "getWeatherCache: Daily = " + e.getMessage()); - } - } - public MutableLiveData mLocationData = new MutableLiveData<>(); public void getLocation() { @@ -210,7 +146,6 @@ public class WeatherViewModel extends BaseViewModel { - private static final String TAG = "WeatherDayApdapterPort"; +public class WeatherDayApdapter extends RecyclerView.Adapter { + private static final String TAG = "WeatherDayApdapter"; private List mDailyBeans; private Context mContext; @@ -34,7 +35,7 @@ public class WeatherDayApdapterPort extends RecyclerView.Adapter() { - @Override - public void onChanged(@Nullable MapBean mapBean) { - mViewDataBinding.tvLocation.setText(mapBean.getDistrict()); - } - }); - } else { - - } - } + private List mContacts = new ArrayList() {{ + this.add(new Contact("未设置")); + this.add(new Contact("未设置")); + this.add(new Contact("未设置")); + this.add(new Contact("未设置")); + this.add(new Contact("未设置")); + this.add(new Contact("未设置")); + }}; @Override protected void initData(Bundle savedInstanceState) { - LiveEventBus - .get("getWeatherNowKey", WeatherNowBean.NowBaseBean.class) - .observe(this, new Observer() { - @Override - public void onChanged(@Nullable WeatherNowBean.NowBaseBean nowBaseBean) { - mViewDataBinding.tvTemp.setText(nowBaseBean.getTemp() + "℃"); - if (DayUtils.isNight()) { -// mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_night)); - } else { - switch (nowBaseBean.getIcon()) { - default: - case "100": - case "150": - //晴 -// mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather)); - break; - case "102": - case "152": - //少云 -// mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_rain)); - break; - } - } -// mViewDataBinding.tvWeather.setText(nowBaseBean.getText()); - } - }); - -// LiveEventBus -// .get("getWeather24HourlyKey", WeatherHourlyBean.HourlyBean.class) -// .observe(this, new Observer() { -// @Override -// public void onChanged(@Nullable WeatherHourlyBean.HourlyBean hourlyBean) { -// String imageName = "he" + hourlyBean.getIcon(); -// Log.e(TAG, "onSuccess: " + imageName); -// if (isAdded()) { -// int resId = getResources().getIdentifier(imageName, "drawable", mContext.getPackageName()); -//// Log.e(TAG, "onSuccess: " + resId); -//// if (resId == 0) { -//// mViewDataBinding.ivPic.setImageDrawable(mContext.getDrawable(R.drawable.he100)); -//// } else { -//// mViewDataBinding.ivPic.setImageDrawable(mContext.getDrawable(resId)); -//// } -// mViewDataBinding.tvTemp.setText(hourlyBean.getTemp() + "℃"); -// } -// } -// }); -// -// LiveEventBus -// .get("getWeather7DKey", WeatherDailyBean.DailyBean.class) -// .observe(this, new Observer() { -// @Override -// public void onChanged(@Nullable WeatherDailyBean.DailyBean dailyBean) { -// mViewDataBinding.tvWeather.setText(dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); -// } -// }); -// -// LiveEventBus -// .get("time", String.class) -// .observe(this, new Observer() { -// @Override -// public void onChanged(@Nullable String s) { -// mViewDataBinding.tvTime.setText(s); -// } -// }); -// -// LiveEventBus -// .get("date", String.class) -// .observe(this, new Observer() { -// @Override -// public void onChanged(@Nullable String s) { -// mViewDataBinding.tvData.setText(s); -// } -// }); -// -// LiveEventBus -// .get("week", String.class) -// .observe(this, new Observer() { -// @Override -// public void onChanged(@Nullable String s) { -// mViewDataBinding.tvWeek.setText(s); -// } -// }); - mViewModel.mContactListData.observe(this, new Observer>() { @Override public void onChanged(List contacts) { - if (contacts == null || contacts.size() == 0) { - contacts .add(new Contact("未设置")); - contacts .add(new Contact("未设置")); - contacts .add(new Contact("未设置")); - contacts .add(new Contact("未设置")); - contacts .add(new Contact("未设置")); - contacts .add(new Contact("未设置")); -// mViewDataBinding.clNodata.setVisibility(View.VISIBLE); -// mViewDataBinding.rvContact.setVisibility(View.GONE); + if (contacts == null || contacts.isEmpty()) { + mContactAdapter.setContactList(mContacts); } else { -// mViewDataBinding.clNodata.setVisibility(View.GONE); -// mViewDataBinding.rvContact.setVisibility(View.VISIBLE); -// List sim = getSIMContacts(); -// if (sim.size() != 0) { -// contacts.addAll(sim); -// } + mContactAdapter.setContactList(contacts); } - mContactAdapter.setContactList(contacts); - } - }); - mViewModel.mDeleteData.observe(this, new Observer() { - @Override - public void onChanged(BaseResponse baseResponse) { - if (baseResponse.code == 200) { - Toaster.show("删除成功"); - } else { - Toaster.show("删除失败:" + baseResponse.msg); - } - mViewModel.getContact(); } }); + + Log.e(TAG, "initData: "); } @Override public void fetchData() { Log.e(TAG, "fetchData: "); - mViewModel.getCacheContact(); + mViewModel.getContact(); } @Override public void onResume() { super.onResume(); - String district = mMMKV.decodeString(CommonConfig.MANUALLY_SELECT_LOCATION_DISTRICT, CommonConfig.DEFAULT_LOCATION_DISTRICT); - mViewDataBinding.tvLocation.setText(district); - } - - private EditContactDialog mEditContactDialog; - - private void showDialog(Contact contact) { - if (mEditContactDialog == null) { - mEditContactDialog = new EditContactDialog(getContext()); - } - mEditContactDialog - .setPhoneNumber(contact.getMobile()) - .setOnClickBottomListener(new EditContactDialog.OnClickBottomListener() { - @Override - public void onEditClick() { - Intent intent = new Intent(getContext(), EditContactActivity.class); - intent.putExtra("Contact", contact); - startActivity(intent); - mEditContactDialog.dismiss(); - } - - @Override - public void onDeleteClick() { - mViewModel.deleteContact(contact.getId()); - mEditContactDialog.dismiss(); - } - - @Override - public void onCancelClick() { - mEditContactDialog.dismiss(); - } - }); - Window window = mEditContactDialog.getWindow(); - window.setGravity(Gravity.BOTTOM); - mEditContactDialog.show(); + mViewModel.getContact(); } public static final String NAME = "name"; diff --git a/app/src/main/java/com/vscool/os/fragment/contact/ContactViewModel.java b/app/src/main/java/com/vscool/os/fragment/contact/ContactViewModel.java index 00e9e03..dbc459a 100644 --- a/app/src/main/java/com/vscool/os/fragment/contact/ContactViewModel.java +++ b/app/src/main/java/com/vscool/os/fragment/contact/ContactViewModel.java @@ -1,34 +1,18 @@ package com.vscool.os.fragment.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.FragmentEvent; import com.vscool.os.base.mvvm.BaseViewModel; -import com.vscool.os.bean.BaseResponse; import com.vscool.os.bean.Contact; import com.vscool.os.config.CommonConfig; import com.vscool.os.databinding.FragmentContactHomeBinding; -import com.vscool.os.db.ContactCacheUtils; -import com.vscool.os.gson.GsonUtils; import com.vscool.os.network.NetInterfaceManager; import com.vscool.os.network.UrlAddress; -import com.vscool.os.utils.ContactsUtils; -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 = "ContactListViewModel"; private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); @@ -45,98 +29,29 @@ public class ContactViewModel extends BaseViewModel> mContactListData = new MutableLiveData<>(); - 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) { - contacts.addAll(ContactCacheUtils.getInstance().getDatabaseContact()); - mContactListData.setValue(contacts); + public void getContact() { + NetInterfaceManager.getInstance().getContactListObserverCache(UrlAddress.GET_MAIL_LIST, new NetInterfaceManager.ContactCallback() { + @Override + public void setContact(List contactList) { + mContactListData.setValue(contactList); + } + + @Override + public void onComplete() { } - } - getContact(); - } + }); - public void getContact() { NetInterfaceManager.getInstance() - .getContactListObservable() - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.DESTROY)) - .subscribe(new Observer>>() { + .getContactListFragment(getLifecycle(), new NetInterfaceManager.ContactCallback() { @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) { - List contactList = listBaseResponse.data; - String oldCache = mMMKV.getString(UrlAddress.GET_MAIL_LIST, ""); - if (!oldCache.equals(GsonUtils.toJSONString(listBaseResponse.data))) { - ContactsUtils.saveContactPhone(getCtx(), contactList); - } - mContactListData.setValue(contactList); - mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(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(ContactCacheUtils.getInstance().getDatabaseContact()); - } else { - contacts.addAll(ContactCacheUtils.getInstance().getDatabaseContact()); - mContactListData.setValue(contacts); - } - onComplete(); + public void setContact(List contactList) { + mContactListData.setValue(contactList); } @Override public void onComplete() { - Log.e("getContactList", "onComplete: "); - } - }); - } - public MutableLiveData mDeleteData = new MutableLiveData<>(); - - public void deleteContact(long id) { - NetInterfaceManager.getInstance().getMailListDeleteObservable(id) - .compose(RxLifecycle.bindUntilEvent(getLifecycle(), FragmentEvent.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/vscool/os/fragment/phone/contact/ContactFragment.java b/app/src/main/java/com/vscool/os/fragment/phone/contact/ContactFragment.java index ac76ee4..bf096b8 100644 --- a/app/src/main/java/com/vscool/os/fragment/phone/contact/ContactFragment.java +++ b/app/src/main/java/com/vscool/os/fragment/phone/contact/ContactFragment.java @@ -123,19 +123,19 @@ public class ContactFragment extends BaseMvvmFragment> mContactListData = new MutableLiveData<>(); - 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(), FragmentEvent.DESTROY)) - .subscribe(new Observer>>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("getContactList", "onSubscribe: "); - } + NetInterfaceManager.getInstance().getContactListObserverCache(UrlAddress.GET_MAIL_LIST, new NetInterfaceManager.ContactCallback() { + @Override + public void setContact(List contactList) { + mContactListData.setValue(contactList); + } - @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { - Log.e("getContactList", "onNext: " + listBaseResponse); - if (listBaseResponse.code == 200) { - List contactList = listBaseResponse.data; - String oldCache = mMMKV.getString(UrlAddress.GET_MAIL_LIST, ""); - if (!oldCache.equals(GsonUtils.toJSONString(contactList))) { - ContactsUtils.saveContactPhone(getCtx(), contactList); - } - mContactListData.setValue(contactList); - mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(contactList)); - } else { - mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); - mContactListData.setValue(new ArrayList<>()); - } - } + @Override + public void onComplete() { - @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: "); - } - }); + NetInterfaceManager.getInstance().getContactListFragment(getLifecycle(), new NetInterfaceManager.ContactCallback() { + @Override + public void setContact(List contactList) { + mContactListData.setValue(contactList); + } + + @Override + public void onComplete() { + + } + }); } public MutableLiveData mDeleteData = new MutableLiveData<>(); @@ -135,6 +92,9 @@ public class ContactViewModel extends BaseViewModel mExcludeApp = new HashSet() {{ this.add("com.android.contacts"); - this.add("com.android.dialer"); +// this.add("com.android.dialer"); // this.add("com.mediatek.camera"); this.add("cn.etouch.ecalendar"); }}; diff --git a/app/src/main/java/com/vscool/os/manager/DesktopIconManager.java b/app/src/main/java/com/vscool/os/manager/DesktopIconManager.java index 42e5c72..257de7e 100644 --- a/app/src/main/java/com/vscool/os/manager/DesktopIconManager.java +++ b/app/src/main/java/com/vscool/os/manager/DesktopIconManager.java @@ -76,8 +76,6 @@ public class DesktopIconManager { public Drawable getPackageIcon(String pkg) { switch (pkg) { - case PackagesName.VSCOOL_SERVICE: - return mContext.getDrawable(R.drawable.icon_wechat_service); case PackagesName.VSCOOL_EXIT_DESKTOP: return mContext.getDrawable(R.drawable.exit_icon); default: diff --git a/app/src/main/java/com/vscool/os/network/NetInterfaceManager.java b/app/src/main/java/com/vscool/os/network/NetInterfaceManager.java index e96b290..c2f4650 100644 --- a/app/src/main/java/com/vscool/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/vscool/os/network/NetInterfaceManager.java @@ -3,6 +3,7 @@ package com.vscool.os.network; import android.annotation.SuppressLint; import android.content.Context; import android.os.Environment; +import android.text.TextUtils; import android.util.Log; import com.google.gson.Gson; @@ -92,10 +93,12 @@ import com.vscool.os.network.api.uiui.sn.SnInfoApi; import com.vscool.os.network.api.uiui.sn.SosRecordApi; import com.vscool.os.network.api.uiui.sn.UpdateAddressApi; import com.vscool.os.network.interceptor.RepeatRequestInterceptor; +import com.vscool.os.utils.ContactsUtils; import com.vscool.os.utils.Utils; import java.io.File; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -121,6 +124,8 @@ import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class NetInterfaceManager { + private static final String TAG = "NetInterfaceManager"; + @SuppressLint("StaticFieldLeak") private static NetInterfaceManager INSTANCE; private Context mContext; @@ -1105,16 +1110,6 @@ public class NetInterfaceManager { }); } - public interface ContactCallback { - void setContact(List contactList); - - void setEmergencyContact(List emergencyContact); - - void setEmpty(); - - void onComplete(); - } - // public void getSystemSettings(boolean refresh, BehaviorSubject lifecycle, ContactCallback callback) { // ConnectMode connectMode = ConnectMode.ONE_MINUTE; // if (refresh) { @@ -1176,7 +1171,7 @@ public class NetInterfaceManager { String s = systemSettings.getSetting_sos(); } else { mCacheHelper.put(UrlAddress.GET_SETTINGS, ""); - if (callback != null) callback.setEmpty(); + if (callback != null) callback.setContact(null); } } @@ -1186,14 +1181,14 @@ public class NetInterfaceManager { String jsonString = mCacheHelper.getAsString(UrlAddress.GET_SETTINGS); //为 "" 是已经请求成功的 if (jsonString == null) { - if (callback != null) callback.setEmpty(); + if (callback != null) callback.setContact(null); } else { Gson gson = new Gson(); Type type = new TypeToken>() { }.getType(); List setting_sos = gson.fromJson(jsonString, type); if (setting_sos == null || setting_sos.size() == 0) { - if (callback != null) callback.setEmpty(); + if (callback != null) callback.setContact(null); } else { if (callback != null) callback.setContact(setting_sos); } @@ -1210,32 +1205,10 @@ public class NetInterfaceManager { }; } + public interface ContactCallback { + void setContact(List contactList); - public void getContactList(boolean refresh, BehaviorSubject lifecycle, ContactCallback callback) { - ConnectMode connectMode = ConnectMode.ONE_MINUTE; - if (refresh) { - connectMode = ConnectMode.DEFAULT; - } - if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_MAIL_LIST, connectMode)) { - getContactList(lifecycle, callback); - } else { - String jsonString = mCacheHelper.getAsString(UrlAddress.GET_MAIL_LIST); - //为 "" 是已经请求成功的 - if (jsonString == null) { - getContactList(lifecycle, callback); - } else { - Gson gson = new Gson(); - Type type = new TypeToken>() { - }.getType(); - List setting_sos = gson.fromJson(jsonString, type); - if (setting_sos == null || setting_sos.size() == 0) { - if (callback != null) callback.setEmpty(); - } else { - if (callback != null) callback.setContact(setting_sos); - } - if (callback != null) callback.onComplete(); - } - } + void onComplete(); } public void getContactList(BehaviorSubject lifecycle, ContactCallback callback) { @@ -1244,16 +1217,12 @@ public class NetInterfaceManager { .subscribe(getContactListObserver(callback)); } - public void getContactList(ContactCallback callback) { + public void getContactListFragment(BehaviorSubject lifecycle, ContactCallback callback) { getContactListObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycle, FragmentEvent.DESTROY)) .subscribe(getContactListObserver(callback)); } - public void getContactList() { - getContactListObservable() - .subscribe(getContactListObserver(null)); - } - public Observer>> getContactListObserver(ContactCallback callback) { return new Observer>>() { @Override @@ -1267,25 +1236,27 @@ public class NetInterfaceManager { if (listBaseResponse.code == 200) { List contactList = listBaseResponse.data; if (contactList == null || contactList.size() == 0) { - mCacheHelper.put(UrlAddress.GET_MAIL_LIST, ""); - if (callback != null) callback.setEmpty(); + mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); + if (callback != null) callback.setContact(new ArrayList<>()); } else { - mCacheHelper.put(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(contactList)); - List emergencyContact = contactList.stream().filter(contact -> contact.getIs_urgent() == 1).collect(Collectors.toList()); + mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(contactList)); + ContactsUtils.saveContactPhone(mContext, contactList); + List emergencyConcacts = contactList.stream().filter(contact -> contact.getIs_urgent() == 1).collect(Collectors.toList()); + mMMKV.putString(CommonConfig.EMERGENCY_CONTACT_LIST_KEY, GsonUtils.toJSONString(emergencyConcacts)); if (callback != null) { callback.setContact(contactList); - callback.setEmergencyContact(emergencyContact); } } } else { - mCacheHelper.put(UrlAddress.GET_MAIL_LIST, ""); - if (callback != null) callback.setEmpty(); + mMMKV.putString(UrlAddress.GET_MAIL_LIST, ""); + if (callback != null) callback.setContact(new ArrayList<>()); } } @Override public void onError(@NonNull Throwable e) { Log.e("getContactList", "onError: " + e.getMessage()); + getContactListObserverCache(UrlAddress.GET_MAIL_LIST, callback); onComplete(); } @@ -1298,6 +1269,49 @@ public class NetInterfaceManager { }; } + public void addContactCache(String tag, Contact contact) { + String jsonString = mMMKV.getString(tag, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + if (TextUtils.isEmpty(jsonString)) { + List contacts = new ArrayList<>(); + contacts.add(contact); + mMMKV.putString(tag, GsonUtils.toJSONString(contacts)); + } else { + try { + List contacts = gson.fromJson(jsonString, type); + if (contacts == null) { + contacts = new ArrayList<>(); + } + contacts.add(contact); + mMMKV.putString(tag, GsonUtils.toJSONString(contacts)); + } catch (Exception e) { + Log.e(TAG, "addContactCache: " + e.getMessage()); + mMMKV.remove(tag); + } + } + } + + public void getContactListObserverCache(String tag, ContactCallback callback) { + String jsonString = mMMKV.getString(tag, null); + Gson gson = new Gson(); + Type type = new TypeToken>() { + }.getType(); + if (TextUtils.isEmpty(jsonString)) { + if (callback != null) callback.setContact(new ArrayList<>()); + } else { + try { + List contacts = gson.fromJson(jsonString, type); + if (callback != null) callback.setContact(contacts); + } catch (Exception e) { + Log.e(TAG, "getContactListObserverCache: " + e.getMessage()); + mMMKV.remove(tag); + if (callback != null) callback.setContact(new ArrayList<>()); + } + } + } + public void getAdminSnSetting(boolean refresh, BehaviorSubject lifecycle, onCompleteCallback callback) { ConnectMode connectMode = ConnectMode.ONE_MINUTE; if (refresh) { diff --git a/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java b/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java index 8fe67ba..d997f98 100644 --- a/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java +++ b/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java @@ -19,10 +19,13 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; +import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; import com.vscool.os.bean.Contact; import com.vscool.os.config.CommonConfig; +import java.util.List; + /** * 通过微信标签最高支持8.0.49,8.0.50 获取不到数据 */ @@ -35,7 +38,7 @@ public class WeAccessibilityService extends AccessibilityService { private static final String DIALER_TEXT = "音视频通话"; private static final String CONTACT_TEXT = "通讯录"; private static final String TAG_TEXT = "标签"; - private static final String TAG_NAME = "孝心通"; + private static final String TAG_NAME = "亲情桌面"; private static final String MORE_NAME = "更多功能按钮,已折叠"; private static final String PARENT_VIDEO_TEXT = "视频通话"; @@ -129,6 +132,21 @@ public class WeAccessibilityService extends AccessibilityService { * @param event */ private void _onAccessibilityEvent(AccessibilityEvent event) { + + switch (mCurrentStep) { + case WAITING: + break; + default: + if (!TextUtils.isEmpty(event.getClassName())) { + if ("com.tencent.mm.ui.LauncherUI".contentEquals(event.getClassName())) { + if (mCurrentStep != Step.FIND_CONTACT) { + mCurrentStep = Step.CLICK_CONTACT; + } + } else if ("com.tencent.mm.plugin.label.ui.ContactLabelManagerUI".contentEquals(event.getClassName())) { + + } + } + } Log.e(TAG, "_onAccessibilityEvent: " + mCurrentStep); switch (mCurrentStep) { case WAITING: @@ -149,10 +167,12 @@ public class WeAccessibilityService extends AccessibilityService { break; case CLICK_CONTACT://进入通讯录界面 - step(Property.TEXT, CONTACT_TEXT, Step.FIND_TAG); + touchContact(); +// step(Property.TEXT, CONTACT_TEXT, Step.FIND_TAG); break; case FIND_CONTACT://模拟滑动找到联系人 findContact(Property.TEXT, mName, Step.CLICK_NAME); + break; case FIND_TAG: step(Property.TEXT, TAG_TEXT, Step.CLICK_TAG); break; @@ -213,6 +233,12 @@ public class WeAccessibilityService extends AccessibilityService { private boolean step(Property type, String text, Step nextStep) { AccessibilityNodeInfo node = findNode(getRootInActiveWindow(), type, text); if (node != null) { + Rect rect = new Rect(); + node.getBoundsInScreen(rect); + Log.e(TAG, "step: rect = " + rect); + if (rect.left < 0 || rect.top < 0 || rect.right < 0 || rect.bottom < 0) { + return false; + } clickNode(node); Log.e(TAG, "step: mCurrentStep: " + mCurrentStep + " done"); mCurrentStep = nextStep; @@ -223,6 +249,40 @@ public class WeAccessibilityService extends AccessibilityService { } } + private void touchContact() { + boolean successful = clickByPoint(268, 1440); + if (successful) { + mCurrentStep = Step.FIND_TAG; + } else { + mCurrentStep = Step.WAITING; + Toaster.show("点击失败,请重试"); + } + } + + private List findNodesByViewId(String id) { + List accessibilityNodeInfos = getRootInActiveWindow().findAccessibilityNodeInfosByViewId(id); + return accessibilityNodeInfos; + } + + private AccessibilityNodeInfo findNodeByText(AccessibilityNodeInfo root, String text) { + if (root == null) return null; + Log.e(TAG, "findNodeByText: getText = " + root.getText()); + Log.e(TAG, "findNodeByText: getContentDescription = " + root.getContentDescription()); + boolean found = root.getText() != null && text.contentEquals(root.getText()); + if (found) { + return root; + } else { + for (int i = 0; i < root.getChildCount(); i++) { + AccessibilityNodeInfo result = findNodeByText(root.getChild(i), text); + if (result != null) { + return result; + } + } + } + root.recycle(); + return null; + } + private boolean stepCallDialog(Property type, String text, Step nextStep) { AccessibilityNodeInfo node = findNode(getRootInActiveWindow(), type, text); if (node != null) { @@ -234,12 +294,23 @@ public class WeAccessibilityService extends AccessibilityService { Log.e(TAG, "stepCallDialog: next: " + mCurrentStep); return true; } else { - scrolDown(); + scrollDown(); return false; } } else { - scrolDown(); - return false; + if (mFindCount == mMaxCount) { + Log.e("stepCallDialog", "mCurrentStep: max"); + Toast.makeText(this, "没有找到联系人", Toast.LENGTH_LONG).show(); + mCurrentStep = Step.WAITING; + mFindCount = 0; + return false; + } else { + Log.e("stepCallDialog", "mCurrentStep: not found"); + mFindCount++; + Log.e("stepCallDialog", "mCurrentStep: mFindCount = " + mFindCount); + scrollDown(); + return false; + } } } @@ -281,7 +352,7 @@ public class WeAccessibilityService extends AccessibilityService { Log.e("findContact", "mCurrentStep: not found"); mFindCount++; Log.e("findContact", "mCurrentStep: mFindCount = " + mFindCount); - scrolDown(); + scrollDown(); return false; } } @@ -324,32 +395,37 @@ public class WeAccessibilityService extends AccessibilityService { private void clickNode(AccessibilityNodeInfo node) { try { Log.e(TAG, "clickNode: getText = " + node.getText()); + Log.e(TAG, "clickNode: isClickable = " + node.isClickable()); } catch (Exception e) { Log.e(TAG, "clickNode: e = " + e.getMessage()); } - Log.e(TAG, "clickNode: isClickable = " + node.isClickable()); if (node.isClickable()) { boolean performAction = node.performAction(AccessibilityNodeInfo.ACTION_CLICK); Log.e(TAG, "clickNode: performAction = " + performAction); if (!performAction) { Rect rect = new Rect(); node.getBoundsInScreen(rect); - int x = rect.left; - int y = rect.top; - Log.e(TAG, "clickNode: x = " + x); - Log.e(TAG, "clickNode: y = " + y); - int width = rect.width(); - int height = rect.height(); - Log.e(TAG, "clickNode: width = " + width); - Log.e(TAG, "clickNode: height = " + height); - Log.e(TAG, "clickNode: clickByNode = " + clickByNode(x + width / 2, y + height / 2)); + Log.e(TAG, "clickNode: rect = " + rect); + // 点击节点的中心位置 + int centerX = (rect.left + rect.right) / 2; + int centerY = (rect.top + rect.bottom) / 2; + Log.e(TAG, "clickNode: clickByNode = " + clickByPoint(centerX, centerY)); } node.recycle(); } else { - AccessibilityNodeInfo parent = node.getParent(); - node.recycle(); - clickNode(parent); + Rect rect = new Rect(); + node.getBoundsInScreen(rect); + Log.e(TAG, "clickNode: rect = " + rect); + // 点击节点的中心位置 + int centerX = (rect.left + rect.right) / 2; + int centerY = (rect.top + rect.bottom) / 2; + Log.e(TAG, "clickNode: clickByNode = " + clickByPoint(centerX, centerY)); } +// else { +// AccessibilityNodeInfo parent = node.getParent(); +// node.recycle(); +// clickNode(parent); +// } } private boolean stepCall(Property type, String text) { @@ -357,7 +433,7 @@ public class WeAccessibilityService extends AccessibilityService { if (node != null) { Point point = getPointtByNode(node); Log.e(TAG, "stepCall: " + point); - clickByNode(point.x, point.y + 30); + clickByPoint(point.x, point.y + 30); // clickNode(node); Log.e(TAG, "stepCall: mCurrentStep " + mCurrentStep + " done"); mCurrentStep = Step.CLICK_CALL; @@ -374,8 +450,8 @@ public class WeAccessibilityService extends AccessibilityService { if (node != null) { Point point = getPointtByNode(node); Log.e(TAG, "stepAnswer: " + point); - clickByNode(point.x, point.y - 50); - clickByNode(point.x, point.y); + clickByPoint(point.x, point.y - 50); + clickByPoint(point.x, point.y); // clickNode(node); Log.e(TAG, "stepAnswer: mCurrentStep " + mCurrentStep + " done"); mCurrentStep = Step.WAITING; @@ -399,14 +475,16 @@ public class WeAccessibilityService extends AccessibilityService { } //实现对(x,y)坐标进行点击操作。 - private boolean clickByNode(int x, int y) { + private boolean clickByPoint(int x, int y) { + Log.e(TAG, "clickByNode: x = " + x); + Log.e(TAG, "clickByNode: y = " + y); Point point = new Point(x, y); Path path = new Path(); path.moveTo(point.x, point.y); GestureDescription.Builder builder = new GestureDescription.Builder(); builder.addStroke(new GestureDescription.StrokeDescription(path, 0, 200)); GestureDescription gesture = builder.build(); - boolean isDispatched = dispatchGesture(gesture, new GestureResultCallback() { + boolean dispatched = dispatchGesture(gesture, new GestureResultCallback() { @Override public void onCompleted(GestureDescription gestureDescription) { super.onCompleted(gestureDescription); @@ -419,10 +497,10 @@ public class WeAccessibilityService extends AccessibilityService { Log.e("clickByNode", "onCompleted: "); } }, null); - return isDispatched; + return dispatched; } - private boolean scrolDown() { + private boolean scrollScreen(double startY, double endY) { WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); wm.getDefaultDisplay().getRealMetrics(dm); @@ -433,34 +511,40 @@ public class WeAccessibilityService extends AccessibilityService { // 屏幕宽度算法:屏幕宽度(像素)/屏幕密度 // int screenWidth = (int) (width / density); // 屏幕宽度(dp) // int screenHeight = (int) (height / density);// 屏幕高度(dp) - Log.e(TAG, "scrolDown: screenWidth = " + width); - Log.e(TAG, "scrolDown: screenHeight = " + height); + Log.e(TAG, "scrollScreen: screenWidth = " + width); + Log.e(TAG, "scrollScreen: screenHeight = " + height); int center_X = width / 2; int center_Y = height / 2; - Log.e("scrolDown", "center position:" + "(" + center_X + "," + center_Y + ")"); + Log.e("scrollScreen", "center position:" + "(" + center_X + "," + center_Y + ")"); Path path = new Path(); - path.moveTo(center_X, (int) (center_Y * 1.5)); //起点坐标。 - path.lineTo(center_X, (int) (center_Y * 0.5)); //终点坐标。 + path.moveTo(center_X, (int) (center_Y * startY)); //起点坐标。 + path.lineTo(center_X, (int) (center_Y * endY)); //终点坐标。 GestureDescription.Builder builder = new GestureDescription.Builder(); GestureDescription gestureDescription = builder.addStroke(new GestureDescription.StrokeDescription(path, 0, 200)).build(); - boolean isDispatched = dispatchGesture(gestureDescription, new GestureResultCallback() { + boolean dispatched = dispatchGesture(gestureDescription, new GestureResultCallback() { @Override public void onCompleted(GestureDescription gestureDescription) { super.onCompleted(gestureDescription); - Log.d("scrolDown", "dispatchGesture ScrollUp onCompleted."); + Log.d("scrollScreen", "dispatchGesture ScrollUp onCompleted."); path.close(); } @Override public void onCancelled(GestureDescription gestureDescription) { super.onCancelled(gestureDescription); - Log.d("scrolDown", "dispatchGesture ScrollUp cancel."); + Log.d("scrollScreen", "dispatchGesture ScrollUp cancel."); } }, null); - - return isDispatched; + return dispatched; } + private boolean scrollDown() { + return scrollScreen(1.5, 0.5); + } + + private boolean scrollUp() { + return scrollScreen(0.5, 1.5); + } private enum Step { WAITING, diff --git a/app/src/main/java/com/vscool/os/service/main/MainService.java b/app/src/main/java/com/vscool/os/service/main/MainService.java index 03ee04c..3a54d9f 100644 --- a/app/src/main/java/com/vscool/os/service/main/MainService.java +++ b/app/src/main/java/com/vscool/os/service/main/MainService.java @@ -28,6 +28,8 @@ import com.google.gson.reflect.TypeToken; import com.hjq.toast.Toaster; import com.shehuan.niv.NiceImageView; import com.tencent.mmkv.MMKV; +import com.trello.rxlifecycle4.RxLifecycle; +import com.trello.rxlifecycle4.android.ActivityEvent; import com.vscool.os.BuildConfig; import com.vscool.os.R; import com.vscool.os.activity.main.MainActivity; @@ -55,8 +57,10 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.ObservableEmitter; import io.reactivex.rxjava3.core.ObservableOnSubscribe; @@ -222,6 +226,38 @@ public class MainService extends BaseRxService implements MainSContact.MainSView registerOperateAlarmClockReceiver(); registerScreenLockReceiver(); registerSmsReceiver(); + + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + mTimeSignalCallback = emitter::onNext; + } + }).throttleFirst(1, TimeUnit.MINUTES) + .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("mTimeSignalCallback", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull Integer hour) { + Log.e("mTimeSignalCallback", "onNext: "); + mSoundPool.play(soundMap.get(hour), 1, 1, 0, 0, 1); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("mTimeSignalCallback", "onError: "); + } + + @Override + public void onComplete() { + Log.e("mTimeSignalCallback", "onComplete: "); + } + }); } @Override @@ -374,19 +410,31 @@ public class MainService extends BaseRxService implements MainSContact.MainSView @Override public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) { - Log.e(TAG, "TimeChangedReceiver:" + "data changed"); - } else if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) { - Log.e(TAG, "TimeChangedReceiver:" + "time changed"); - } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { - Log.e(TAG, "TimeChangedReceiver:" + "timezone changed"); - } else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) { - Log.e(TAG, "TimeChangedReceiver:" + "time tick"); - hourlyTimeSignal(); + switch (intent.getAction()) { + case Intent.ACTION_DATE_CHANGED: + Log.e(TAG, "TimeChangedReceiver:" + "data changed"); + break; + case Intent.ACTION_TIME_CHANGED: + Log.e(TAG, "TimeChangedReceiver:" + "time changed"); + break; + case Intent.ACTION_TIMEZONE_CHANGED: + Log.e(TAG, "TimeChangedReceiver:" + "timezone changed"); + break; + case Intent.ACTION_TIME_TICK: + Log.e(TAG, "TimeChangedReceiver:" + "time tick"); + hourlyTimeSignal(); + break; + default: } } } + private interface TimeSignalCallback { + void timeTick(int hour); + } + + private TimeSignalCallback mTimeSignalCallback; + private void hourlyTimeSignal() { boolean hourly_time = mMMKV.decodeBool(CommonConfig.HOURLY_TIME_SIGNAL_KEY, false); if (hourly_time) { @@ -396,7 +444,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView int min = cal.get(Calendar.MINUTE); Log.e(TAG, "hourlyTimeSignal: min = " + min); if (min == 0) { - mSoundPool.play(soundMap.get(hour), 1, 1, 0, 0, 1); + mTimeSignalCallback.timeTick(hour); } } else { Log.e(TAG, "hourlyTimeSignal: not enable hourly time signal"); @@ -409,12 +457,14 @@ public class MainService extends BaseRxService implements MainSContact.MainSView } IntentFilter filter = new IntentFilter(); filter.addAction(HOURLY_TIME_SIGNAL_KEY); + filter.addAction(WECHAT_AUTO_ACCEPT); registerReceiver(mTimeSignalReceiver, filter); } private TimeSignalReceiver mTimeSignalReceiver; private static final String HOURLY_TIME_SIGNAL_KEY = "hourly_time_signal"; + private static final String WECHAT_AUTO_ACCEPT = "wechat_auto_accept"; private class TimeSignalReceiver extends BroadcastReceiver { @@ -422,11 +472,18 @@ public class MainService extends BaseRxService implements MainSContact.MainSView public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.e("TimeSignalReceiver", "onReceive: " + action); - if (HOURLY_TIME_SIGNAL_KEY.equals(action)) { - int hour_notify = intent.getIntExtra("hour_notify", 0); - Log.e("TimeSignalReceiver", "onReceive: hour_notify = " + hour_notify); - mMMKV.encode(CommonConfig.HOURLY_TIME_SIGNAL_KEY, hour_notify == 1); - + switch (action) { + case HOURLY_TIME_SIGNAL_KEY: + int hour_notify = intent.getIntExtra("hour_notify", 0); + Log.e("TimeSignalReceiver", "onReceive: hour_notify = " + hour_notify); + mMMKV.encode(CommonConfig.HOURLY_TIME_SIGNAL_KEY, hour_notify == 1); + break; + case WECHAT_AUTO_ACCEPT: + int wechat_auto_accept = intent.getIntExtra("wechat_auto_accept", 0); + Log.e("TimeSignalReceiver", "onReceive: wechat_auto_accept = " + wechat_auto_accept); + mMMKV.encode(CommonConfig.WECHAT_CALL_AUTO_ACCEPT, wechat_auto_accept == 1); + break; + default: } } } @@ -756,7 +813,8 @@ public class MainService extends BaseRxService implements MainSContact.MainSView } killBackgroundProcesses(pkg); } - Toaster.show(String.format(getString(R.string.clear_app_size), pkgList.size())); +// Toaster.show(String.format(getString(R.string.clear_app_size), pkgList.size())); + Toaster.show("后台清理应用中"); } private void killBackgroundProcesses(String packageName) { diff --git a/app/src/main/java/com/vscool/os/utils/ApkUtils.java b/app/src/main/java/com/vscool/os/utils/ApkUtils.java index 2494130..83fe11d 100644 --- a/app/src/main/java/com/vscool/os/utils/ApkUtils.java +++ b/app/src/main/java/com/vscool/os/utils/ApkUtils.java @@ -82,7 +82,7 @@ public class ApkUtils { this.add("com.uiui.aios"); this.add("com.uiui.videoplayer"); // this.add("com.uiui.health"); - this.add("com.tencent.android.qqdownloader"); +// this.add("com.tencent.android.qqdownloader"); // this.add("com.vscool.store"); this.add("com.joytv.live"); this.add("com.vscool.store"); diff --git a/app/src/main/java/com/vscool/os/utils/ContactsUtils.java b/app/src/main/java/com/vscool/os/utils/ContactsUtils.java index 0e39ec4..0bee311 100644 --- a/app/src/main/java/com/vscool/os/utils/ContactsUtils.java +++ b/app/src/main/java/com/vscool/os/utils/ContactsUtils.java @@ -1,5 +1,7 @@ package com.vscool.os.utils; +import android.content.ContentProviderOperation; +import android.content.ContentProviderResult; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -41,82 +43,24 @@ import io.reactivex.rxjava3.schedulers.Schedulers; public class ContactsUtils { private static final String TAG = "ContactsUtils"; - - public static void saveContactPhone(Context context, List contactList) { - Log.e(TAG, "saveContactPhone: "); -// List contactIdList = ContactsUtils.getLocalContacts(context); + public static void saveContactPhone(Context context, Contact contact) { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { - for (Contact contact : contactList) { - if (TextUtils.isEmpty(contact.getMobile())) { - continue; + Log.e(TAG, "saveContactPhone: " + contact.getMobile() + " isExist = " + ContactsUtils.isExist(context, contact.getMobile())); + Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).into(new SimpleTarget() { + @Override + public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition transition) { + if (ContactsUtils.isExist(context, contact.getMobile())) { + updateContactPhone(context, contact, resource); + } else { + insertContactPhone(context, contact, resource); + } } - if (ContactsUtils.isExist(context, contact.getMobile())) { - long rawContactId = ContactsUtils.getContactId(context, contact.getMobile()); - Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).into(new SimpleTarget() { - @Override - public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition transition) { - ContentResolver resolver = context.getContentResolver(); - ContentValues nameValues = new ContentValues(); - //add Name - nameValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - nameValues.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/name"); - nameValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); - resolver.update(ContactsContract.Data.CONTENT_URI, nameValues, "raw_contact_id=?" + rawContactId, new String[]{ContactsContract.Data.CONTACT_ID}); - - ContentValues photoValues = new ContentValues(); - photoValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - resource.compress(Bitmap.CompressFormat.PNG, 100, out); - photoValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - photoValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); - resolver.update(ContactsContract.Data.CONTENT_URI, photoValues, "raw_contact_id=?" + rawContactId, new String[]{ContactsContract.Data.CONTACT_ID}); - - ContentValues phoneValues = new ContentValues(); - phoneValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - phoneValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - phoneValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); - phoneValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); - resolver.update(ContactsContract.Data.CONTENT_URI, phoneValues, "raw_contact_id=?" + rawContactId, new String[]{ContactsContract.Data.CONTACT_ID}); - } - }); - } else { - ContentValues values = new ContentValues(); - long rawContactId = ContentUris.parseId(context.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values)); - Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).into(new SimpleTarget() { - @Override - public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition transition) { - ContentResolver resolver = context.getContentResolver(); - ContentValues nameValues = new ContentValues(); - //add Name - nameValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - nameValues.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/name"); - nameValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); - resolver.insert(ContactsContract.Data.CONTENT_URI, nameValues); - - ContentValues photoValues = new ContentValues(); - photoValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - resource.compress(Bitmap.CompressFormat.PNG, 100, out); - photoValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); - photoValues.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); - resolver.insert(ContactsContract.Data.CONTENT_URI, photoValues); - - ContentValues phoneValues = new ContentValues(); - phoneValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - phoneValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); - phoneValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); - phoneValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); - resolver.insert(ContactsContract.Data.CONTENT_URI, phoneValues); - } - }); - } - } + }); emitter.onNext(1L); } - }) - .subscribeOn(Schedulers.io()) + }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override @@ -141,6 +85,275 @@ public class ContactsUtils { }); } + public static void saveContactPhone(Context context, List contactList) { + Log.e(TAG, "saveContactPhone: "); +// List contactIdList = ContactsUtils.getLocalContacts(context); + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + for (Contact contact : contactList) { + if (TextUtils.isEmpty(contact.getMobile())) { + continue; + } + Log.e(TAG, "saveContactPhone: " + contact.getMobile() + " isExist = " + ContactsUtils.isExist(context, contact.getMobile())); + Glide.with(context).asBitmap().load(contact.getAvatar()).error(R.drawable.default_avatar).override(200, 200).into(new SimpleTarget() { + @Override + public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition transition) { + if (ContactsUtils.isExist(context, contact.getMobile())) { + updateContactPhone(context, contact, resource); + emitter.onNext(0L); + } else { + insertContactPhone(context, contact, resource); + emitter.onNext(1L); + } + } + }); + } + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("saveContactPhone", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull Long aLong) { + Log.e("saveContactPhone", "onNext: " + aLong); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("saveContactPhone", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("saveContactPhone", "onComplete: "); + } + }); + } + + public static void insertContactPhone(Context context, Contact contact, Bitmap bitmap) { + ContentValues values = new ContentValues(); + long rawContactId = ContentUris.parseId(context.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values)); + Log.e(TAG, "insertContactPhone: rawContactId = " + rawContactId); + ContentResolver resolver = context.getContentResolver(); + + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); + + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); + + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); + values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + } + + + public static void updateContactPhone(Context context, Contact contact, Bitmap bitmap) { + long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); + Log.e(TAG, "updateContactPhone: rawContactId = " + rawContactId); + ContentResolver resolver = context.getContentResolver(); + + ContentValues values = new ContentValues(); + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); + + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); + +// values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); +// values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); +// values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); +// values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); +// resolver.insert(ContactsContract.Data.CONTENT_URI, values); + +// Log.e(TAG, "updateContactPhone: phoneValues = " + +// resolver.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data.RAW_CONTACT_ID + "='" + rawContactId+"'", null)); + +// String selection = ContactsContract.Data.CONTACT_ID + "=" + contacts.getContactId() + " AND " + Data.MIMETYPE + "='" + StructuredName.CONTENT_ITEM_TYPE + "'"; +// ContentValues values = new ContentValues(); +// values.put(StructuredName.DISPLAY_NAME, contacts.getName()); // make sure getName() returns a String!!! +// getContentResolver().update(Data.CONTENT_URI, values, selection, null); + +// ContentValues values = new ContentValues(); +// values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name); +// values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone); +// Log.d("updateContact", "values已经产生"); +// int result = resolver.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(bean.getId())}); + } + + public static void update(Context context, Contact contact, Bitmap bitmap) { + long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); + + ArrayList ops = new ArrayList(); + ContentProviderOperation op1 = ContentProviderOperation + .newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection( + ContactsContract.Data.RAW_CONTACT_ID + "=? and " + + ContactsContract.Data.MIMETYPE + "=?", + new String[]{ + String.valueOf(rawContactId), + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}) + .withValue( + ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,// 对应data表中的data1字段 + contact.getName()).build(); + ops.add(op1); + + ContentProviderOperation op2 = ContentProviderOperation + .newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection( + ContactsContract.Data.RAW_CONTACT_ID + "=? and " + + ContactsContract.Data.MIMETYPE + "=?", + new String[]{String.valueOf(rawContactId), + ContactsContract.CommonDataKinds.Phone.MIMETYPE}) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,// 对应data表中的data1字段 + contact.getMobile()).build(); + ops.add(op2); + +// ContentProviderOperation op3 = ContentProviderOperation +// .newUpdate(ContactsContract.Data.CONTENT_URI) +// .withSelection( +// ContactsContract.Data.RAW_CONTACT_ID + "=? and " +// + ContactsContract.Data.MIMETYPE + "=?", +// new String[]{String.valueOf(rawContactId), +// ContactsContract.CommonDataKinds.Phone.MIMETYPE}) +// .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS,// 对应data表中的data1字段 +// "test@email.com").build(); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); + ContentProviderOperation op3 = ContentProviderOperation + .newUpdate(ContactsContract.Data.CONTENT_URI) + .withSelection( + ContactsContract.Data.RAW_CONTACT_ID + "=? and " + + ContactsContract.Data.MIMETYPE + "=?", + new String[]{String.valueOf(rawContactId), + ContactsContract.CommonDataKinds.Photo.MIMETYPE}) + .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO,// 对应data表中的data1字段 + out.toByteArray()).build(); + ops.add(op3); + + try { + ContentProviderResult[] contentProviderResults = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + Log.e(TAG, "update: " + Arrays.toString(contentProviderResults)); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "update: " + e.getMessage()); + } + } + + public static void deleteContactPhone(Context context, Contact contact) { + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + deleteRawContact(context, contact.getMobile()); + emitter.onNext(0L); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("deleteContactPhone", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull Long aLong) { + Log.e("deleteContactPhone", "onNext: " + aLong); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("deleteContactPhone", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("deleteContactPhone", "onComplete: "); + } + }); + } + + public static void deleteRawContact(Context context, String phoneNum) { + ContentResolver resolver = context.getContentResolver(); + Cursor cursor = null; + try { + cursor = resolver.query(ContactsContract.Data.CONTENT_URI, + new String[]{ContactsContract.Data.RAW_CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME}, + ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNum}, null); + if (cursor.moveToFirst()) { + long rawContactId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.RAW_CONTACT_ID)); + Log.e(TAG, "deleteRawContact: rawContactId = " + rawContactId); +// int idCode = resolver.delete(ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts._ID + " =?", new String[]{String.valueOf(rawContactId)}); +// Log.e(TAG, "deleteRawContact: idCode = " + idCode); +// int phoneCode = resolver.delete(ContactsContract.Data.CONTENT_URI, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNum}); +// Log.e(TAG, "deleteRawContact: phoneCode = " + phoneCode); +// int contactIdCode = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID + " =?", new String[]{String.valueOf(rawContactId)}); +// Log.e(TAG, "deleteRawContact: contactIdCode = " + contactIdCode); +// String name +// int nameCode = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, "display_name=?", new String[]{name}); +// Log.e(TAG, "deleteRawContact: nameCode = " + nameCode); + + int result = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, + ContactsContract.RawContacts._ID + "=?", + new String[]{String.valueOf(rawContactId)}); + Log.e(TAG, "deleteRawContact: result = " + result); + } + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "deleteRawContact: " + e.getMessage()); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } + + public static long getRawContactId(Context context, String phoneNum) { + ContentResolver resolver = context.getContentResolver(); + Cursor cursor = null; + try { + cursor = resolver.query(ContactsContract.Data.CONTENT_URI, + new String[]{ContactsContract.Data.RAW_CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME}, + ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNum}, null); + if (cursor.moveToFirst()) { + long rawContactId = cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.RAW_CONTACT_ID)); + Log.e(TAG, "getRawContactId: rawContactId = " + rawContactId); + return rawContactId; + } + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "deleteRawContact: " + e.getMessage()); + } finally { + if (cursor != null) { + cursor.close(); + } + } + return -1; + } + /** * 添加联系人信息 */ @@ -156,7 +369,7 @@ public class ContactsUtils { //插入data表 //add Name nameValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); - nameValues.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/name"); + nameValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); nameValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name); resolver.insert(ContactsContract.Data.CONTENT_URI, nameValues); diff --git a/app/src/main/java/com/vscool/os/utils/DayUtils.java b/app/src/main/java/com/vscool/os/utils/DayUtils.java index 0fb9f4d..242e90c 100644 --- a/app/src/main/java/com/vscool/os/utils/DayUtils.java +++ b/app/src/main/java/com/vscool/os/utils/DayUtils.java @@ -12,18 +12,30 @@ public class DayUtils { return hour >= 16 && minute >= 30; } + private static final String[] WEEKS = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + + /** * @return 根据日期取得星期几 */ - public static String getWeek() { - Date date = new Date(); - String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + public static String getWeek(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); int weekIndex = cal.get(Calendar.DAY_OF_WEEK) - 1; if (weekIndex < 0) { weekIndex = 0; } - return weeks[weekIndex]; + return WEEKS[weekIndex]; + } + + public static String getWeek() { + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int weekIndex = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (weekIndex < 0) { + weekIndex = 0; + } + return WEEKS[weekIndex]; } } diff --git a/app/src/main/java/com/vscool/os/utils/TimeUtils.java b/app/src/main/java/com/vscool/os/utils/TimeUtils.java index 3cb92ad..0b9a39d 100644 --- a/app/src/main/java/com/vscool/os/utils/TimeUtils.java +++ b/app/src/main/java/com/vscool/os/utils/TimeUtils.java @@ -69,4 +69,8 @@ public class TimeUtils { return sdf2.format(date2); } + public static String getDateWeek(Date date) { + SimpleDateFormat sdf2 = new SimpleDateFormat("MM/dd"); + return sdf2.format(date); + } } diff --git a/app/src/main/res/drawable-hdpi/call_service.png b/app/src/main/res/drawable-hdpi/call_service.png new file mode 100644 index 0000000..8aca768 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/call_service.png differ diff --git a/app/src/main/res/drawable-hdpi/dialer_call.png b/app/src/main/res/drawable-hdpi/dialer_call.png index 6c914f5..d234908 100644 Binary files a/app/src/main/res/drawable-hdpi/dialer_call.png and b/app/src/main/res/drawable-hdpi/dialer_call.png differ diff --git a/app/src/main/res/drawable-hdpi/he100.png b/app/src/main/res/drawable-hdpi/he100.png index 6669841..e600626 100644 Binary files a/app/src/main/res/drawable-hdpi/he100.png and b/app/src/main/res/drawable-hdpi/he100.png differ diff --git a/app/src/main/res/drawable-hdpi/he101.png b/app/src/main/res/drawable-hdpi/he101.png index 2f74dcf..099d8e6 100644 Binary files a/app/src/main/res/drawable-hdpi/he101.png and b/app/src/main/res/drawable-hdpi/he101.png differ diff --git a/app/src/main/res/drawable-hdpi/he102.png b/app/src/main/res/drawable-hdpi/he102.png index 784b078..2a738fb 100644 Binary files a/app/src/main/res/drawable-hdpi/he102.png and b/app/src/main/res/drawable-hdpi/he102.png differ diff --git a/app/src/main/res/drawable-hdpi/he103.png b/app/src/main/res/drawable-hdpi/he103.png index 8767acb..fd15992 100644 Binary files a/app/src/main/res/drawable-hdpi/he103.png and b/app/src/main/res/drawable-hdpi/he103.png differ diff --git a/app/src/main/res/drawable-hdpi/he104.png b/app/src/main/res/drawable-hdpi/he104.png index 6420624..8033ea8 100644 Binary files a/app/src/main/res/drawable-hdpi/he104.png and b/app/src/main/res/drawable-hdpi/he104.png differ diff --git a/app/src/main/res/drawable-hdpi/he150.png b/app/src/main/res/drawable-hdpi/he150.png index df55ec5..d66bf5a 100644 Binary files a/app/src/main/res/drawable-hdpi/he150.png and b/app/src/main/res/drawable-hdpi/he150.png differ diff --git a/app/src/main/res/drawable-hdpi/he151.png b/app/src/main/res/drawable-hdpi/he151.png new file mode 100644 index 0000000..2ad8289 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/he151.png differ diff --git a/app/src/main/res/drawable-hdpi/he152.png b/app/src/main/res/drawable-hdpi/he152.png new file mode 100644 index 0000000..bb4451f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/he152.png differ diff --git a/app/src/main/res/drawable-hdpi/he153.png b/app/src/main/res/drawable-hdpi/he153.png index f018af0..2bfa038 100644 Binary files a/app/src/main/res/drawable-hdpi/he153.png and b/app/src/main/res/drawable-hdpi/he153.png differ diff --git a/app/src/main/res/drawable-hdpi/he154.png b/app/src/main/res/drawable-hdpi/he154.png index 22f42c0..d16a4a7 100644 Binary files a/app/src/main/res/drawable-hdpi/he154.png and b/app/src/main/res/drawable-hdpi/he154.png differ diff --git a/app/src/main/res/drawable-hdpi/he300.png b/app/src/main/res/drawable-hdpi/he300.png index 1de84ba..b6a29fd 100644 Binary files a/app/src/main/res/drawable-hdpi/he300.png and b/app/src/main/res/drawable-hdpi/he300.png differ diff --git a/app/src/main/res/drawable-hdpi/he301.png b/app/src/main/res/drawable-hdpi/he301.png index 0fc3b9d..5dbc7e3 100644 Binary files a/app/src/main/res/drawable-hdpi/he301.png and b/app/src/main/res/drawable-hdpi/he301.png differ diff --git a/app/src/main/res/drawable-hdpi/he302.png b/app/src/main/res/drawable-hdpi/he302.png index 61c4406..5a1d109 100644 Binary files a/app/src/main/res/drawable-hdpi/he302.png and b/app/src/main/res/drawable-hdpi/he302.png differ diff --git a/app/src/main/res/drawable-hdpi/he303.png b/app/src/main/res/drawable-hdpi/he303.png index 6a8b3c4..fceaeff 100644 Binary files a/app/src/main/res/drawable-hdpi/he303.png and b/app/src/main/res/drawable-hdpi/he303.png differ diff --git a/app/src/main/res/drawable-hdpi/he304.png b/app/src/main/res/drawable-hdpi/he304.png index 19a2556..5ebe66c 100644 Binary files a/app/src/main/res/drawable-hdpi/he304.png and b/app/src/main/res/drawable-hdpi/he304.png differ diff --git a/app/src/main/res/drawable-hdpi/he305.png b/app/src/main/res/drawable-hdpi/he305.png index 1105af0..f3a5869 100644 Binary files a/app/src/main/res/drawable-hdpi/he305.png and b/app/src/main/res/drawable-hdpi/he305.png differ diff --git a/app/src/main/res/drawable-hdpi/he306.png b/app/src/main/res/drawable-hdpi/he306.png index b307070..2197557 100644 Binary files a/app/src/main/res/drawable-hdpi/he306.png and b/app/src/main/res/drawable-hdpi/he306.png differ diff --git a/app/src/main/res/drawable-hdpi/he307.png b/app/src/main/res/drawable-hdpi/he307.png index 810a23a..2d88355 100644 Binary files a/app/src/main/res/drawable-hdpi/he307.png and b/app/src/main/res/drawable-hdpi/he307.png differ diff --git a/app/src/main/res/drawable-hdpi/he308.png b/app/src/main/res/drawable-hdpi/he308.png index 9600919..4dce9ff 100644 Binary files a/app/src/main/res/drawable-hdpi/he308.png and b/app/src/main/res/drawable-hdpi/he308.png differ diff --git a/app/src/main/res/drawable-hdpi/he309.png b/app/src/main/res/drawable-hdpi/he309.png index 9c805d8..2968d52 100644 Binary files a/app/src/main/res/drawable-hdpi/he309.png and b/app/src/main/res/drawable-hdpi/he309.png differ diff --git a/app/src/main/res/drawable-hdpi/he310.png b/app/src/main/res/drawable-hdpi/he310.png index 9608b6e..fa733f7 100644 Binary files a/app/src/main/res/drawable-hdpi/he310.png and b/app/src/main/res/drawable-hdpi/he310.png differ diff --git a/app/src/main/res/drawable-hdpi/he311.png b/app/src/main/res/drawable-hdpi/he311.png index 59c74ed..29c9de4 100644 Binary files a/app/src/main/res/drawable-hdpi/he311.png and b/app/src/main/res/drawable-hdpi/he311.png differ diff --git a/app/src/main/res/drawable-hdpi/he312.png b/app/src/main/res/drawable-hdpi/he312.png index 1daa1da..93c9fdc 100644 Binary files a/app/src/main/res/drawable-hdpi/he312.png and b/app/src/main/res/drawable-hdpi/he312.png differ diff --git a/app/src/main/res/drawable-hdpi/he313.png b/app/src/main/res/drawable-hdpi/he313.png index 11ca685..5cef950 100644 Binary files a/app/src/main/res/drawable-hdpi/he313.png and b/app/src/main/res/drawable-hdpi/he313.png differ diff --git a/app/src/main/res/drawable-hdpi/he314.png b/app/src/main/res/drawable-hdpi/he314.png index 3b6ac91..4ccad8e 100644 Binary files a/app/src/main/res/drawable-hdpi/he314.png and b/app/src/main/res/drawable-hdpi/he314.png differ diff --git a/app/src/main/res/drawable-hdpi/he315.png b/app/src/main/res/drawable-hdpi/he315.png index 8f06fae..21e958e 100644 Binary files a/app/src/main/res/drawable-hdpi/he315.png and b/app/src/main/res/drawable-hdpi/he315.png differ diff --git a/app/src/main/res/drawable-hdpi/he316.png b/app/src/main/res/drawable-hdpi/he316.png index b3395ac..6e73a13 100644 Binary files a/app/src/main/res/drawable-hdpi/he316.png and b/app/src/main/res/drawable-hdpi/he316.png differ diff --git a/app/src/main/res/drawable-hdpi/he317.png b/app/src/main/res/drawable-hdpi/he317.png index 8441d41..b7ebe6a 100644 Binary files a/app/src/main/res/drawable-hdpi/he317.png and b/app/src/main/res/drawable-hdpi/he317.png differ diff --git a/app/src/main/res/drawable-hdpi/he318.png b/app/src/main/res/drawable-hdpi/he318.png index af60e09..3000732 100644 Binary files a/app/src/main/res/drawable-hdpi/he318.png and b/app/src/main/res/drawable-hdpi/he318.png differ diff --git a/app/src/main/res/drawable-hdpi/he350.png b/app/src/main/res/drawable-hdpi/he350.png index 3976006..e22774f 100644 Binary files a/app/src/main/res/drawable-hdpi/he350.png and b/app/src/main/res/drawable-hdpi/he350.png differ diff --git a/app/src/main/res/drawable-hdpi/he351.png b/app/src/main/res/drawable-hdpi/he351.png index b436ea4..fddbb1f 100644 Binary files a/app/src/main/res/drawable-hdpi/he351.png and b/app/src/main/res/drawable-hdpi/he351.png differ diff --git a/app/src/main/res/drawable-hdpi/he399.png b/app/src/main/res/drawable-hdpi/he399.png index 44a094c..2ada0e1 100644 Binary files a/app/src/main/res/drawable-hdpi/he399.png and b/app/src/main/res/drawable-hdpi/he399.png differ diff --git a/app/src/main/res/drawable-hdpi/he400.png b/app/src/main/res/drawable-hdpi/he400.png index e512d55..600ee46 100644 Binary files a/app/src/main/res/drawable-hdpi/he400.png and b/app/src/main/res/drawable-hdpi/he400.png differ diff --git a/app/src/main/res/drawable-hdpi/he401.png b/app/src/main/res/drawable-hdpi/he401.png index 4765e28..b9fc8d9 100644 Binary files a/app/src/main/res/drawable-hdpi/he401.png and b/app/src/main/res/drawable-hdpi/he401.png differ diff --git a/app/src/main/res/drawable-hdpi/he402.png b/app/src/main/res/drawable-hdpi/he402.png index 4fab297..f8c3e3a 100644 Binary files a/app/src/main/res/drawable-hdpi/he402.png and b/app/src/main/res/drawable-hdpi/he402.png differ diff --git a/app/src/main/res/drawable-hdpi/he403.png b/app/src/main/res/drawable-hdpi/he403.png index 77f12a6..730eda4 100644 Binary files a/app/src/main/res/drawable-hdpi/he403.png and b/app/src/main/res/drawable-hdpi/he403.png differ diff --git a/app/src/main/res/drawable-hdpi/he404.png b/app/src/main/res/drawable-hdpi/he404.png index a70a3d0..7149994 100644 Binary files a/app/src/main/res/drawable-hdpi/he404.png and b/app/src/main/res/drawable-hdpi/he404.png differ diff --git a/app/src/main/res/drawable-hdpi/he405.png b/app/src/main/res/drawable-hdpi/he405.png index 697c726..395f250 100644 Binary files a/app/src/main/res/drawable-hdpi/he405.png and b/app/src/main/res/drawable-hdpi/he405.png differ diff --git a/app/src/main/res/drawable-hdpi/he406.png b/app/src/main/res/drawable-hdpi/he406.png index 38657ca..6409361 100644 Binary files a/app/src/main/res/drawable-hdpi/he406.png and b/app/src/main/res/drawable-hdpi/he406.png differ diff --git a/app/src/main/res/drawable-hdpi/he407.png b/app/src/main/res/drawable-hdpi/he407.png index 12647d2..1ac5975 100644 Binary files a/app/src/main/res/drawable-hdpi/he407.png and b/app/src/main/res/drawable-hdpi/he407.png differ diff --git a/app/src/main/res/drawable-hdpi/he408.png b/app/src/main/res/drawable-hdpi/he408.png index 5e11377..2b166cf 100644 Binary files a/app/src/main/res/drawable-hdpi/he408.png and b/app/src/main/res/drawable-hdpi/he408.png differ diff --git a/app/src/main/res/drawable-hdpi/he409.png b/app/src/main/res/drawable-hdpi/he409.png index 5794537..f8c3e3a 100644 Binary files a/app/src/main/res/drawable-hdpi/he409.png and b/app/src/main/res/drawable-hdpi/he409.png differ diff --git a/app/src/main/res/drawable-hdpi/he410.png b/app/src/main/res/drawable-hdpi/he410.png index b2077a1..0aff7a3 100644 Binary files a/app/src/main/res/drawable-hdpi/he410.png and b/app/src/main/res/drawable-hdpi/he410.png differ diff --git a/app/src/main/res/drawable-hdpi/he456.png b/app/src/main/res/drawable-hdpi/he456.png index 1664034..fe7d043 100644 Binary files a/app/src/main/res/drawable-hdpi/he456.png and b/app/src/main/res/drawable-hdpi/he456.png differ diff --git a/app/src/main/res/drawable-hdpi/he457.png b/app/src/main/res/drawable-hdpi/he457.png index 1f56270..aabc47e 100644 Binary files a/app/src/main/res/drawable-hdpi/he457.png and b/app/src/main/res/drawable-hdpi/he457.png differ diff --git a/app/src/main/res/drawable-hdpi/he499.png b/app/src/main/res/drawable-hdpi/he499.png index bc2fbd4..95be990 100644 Binary files a/app/src/main/res/drawable-hdpi/he499.png and b/app/src/main/res/drawable-hdpi/he499.png differ diff --git a/app/src/main/res/drawable-hdpi/he500.png b/app/src/main/res/drawable-hdpi/he500.png index d2ec7d6..3826ab6 100644 Binary files a/app/src/main/res/drawable-hdpi/he500.png and b/app/src/main/res/drawable-hdpi/he500.png differ diff --git a/app/src/main/res/drawable-hdpi/he501.png b/app/src/main/res/drawable-hdpi/he501.png index ef3bc16..3826ab6 100644 Binary files a/app/src/main/res/drawable-hdpi/he501.png and b/app/src/main/res/drawable-hdpi/he501.png differ diff --git a/app/src/main/res/drawable-hdpi/he502.png b/app/src/main/res/drawable-hdpi/he502.png index e7816da..8180aa2 100644 Binary files a/app/src/main/res/drawable-hdpi/he502.png and b/app/src/main/res/drawable-hdpi/he502.png differ diff --git a/app/src/main/res/drawable-hdpi/he503.png b/app/src/main/res/drawable-hdpi/he503.png index 0e5b5d1..22514c2 100644 Binary files a/app/src/main/res/drawable-hdpi/he503.png and b/app/src/main/res/drawable-hdpi/he503.png differ diff --git a/app/src/main/res/drawable-hdpi/he504.png b/app/src/main/res/drawable-hdpi/he504.png index 185b37d..0a01fbe 100644 Binary files a/app/src/main/res/drawable-hdpi/he504.png and b/app/src/main/res/drawable-hdpi/he504.png differ diff --git a/app/src/main/res/drawable-hdpi/he507.png b/app/src/main/res/drawable-hdpi/he507.png index 4a6403d..ddfbb6b 100644 Binary files a/app/src/main/res/drawable-hdpi/he507.png and b/app/src/main/res/drawable-hdpi/he507.png differ diff --git a/app/src/main/res/drawable-hdpi/he508.png b/app/src/main/res/drawable-hdpi/he508.png index a3a333f..7026e61 100644 Binary files a/app/src/main/res/drawable-hdpi/he508.png and b/app/src/main/res/drawable-hdpi/he508.png differ diff --git a/app/src/main/res/drawable-hdpi/he509.png b/app/src/main/res/drawable-hdpi/he509.png index 5900d5c..6e17e1a 100644 Binary files a/app/src/main/res/drawable-hdpi/he509.png and b/app/src/main/res/drawable-hdpi/he509.png differ diff --git a/app/src/main/res/drawable-hdpi/he510.png b/app/src/main/res/drawable-hdpi/he510.png index fdf6422..e2357e7 100644 Binary files a/app/src/main/res/drawable-hdpi/he510.png and b/app/src/main/res/drawable-hdpi/he510.png differ diff --git a/app/src/main/res/drawable-hdpi/he511.png b/app/src/main/res/drawable-hdpi/he511.png index 40cfd0e..44a1249 100644 Binary files a/app/src/main/res/drawable-hdpi/he511.png and b/app/src/main/res/drawable-hdpi/he511.png differ diff --git a/app/src/main/res/drawable-hdpi/he512.png b/app/src/main/res/drawable-hdpi/he512.png index 22ab63a..607030d 100644 Binary files a/app/src/main/res/drawable-hdpi/he512.png and b/app/src/main/res/drawable-hdpi/he512.png differ diff --git a/app/src/main/res/drawable-hdpi/he513.png b/app/src/main/res/drawable-hdpi/he513.png index 6e8c4e3..9829a3d 100644 Binary files a/app/src/main/res/drawable-hdpi/he513.png and b/app/src/main/res/drawable-hdpi/he513.png differ diff --git a/app/src/main/res/drawable-hdpi/he514.png b/app/src/main/res/drawable-hdpi/he514.png index 5892ad0..0ea5946 100644 Binary files a/app/src/main/res/drawable-hdpi/he514.png and b/app/src/main/res/drawable-hdpi/he514.png differ diff --git a/app/src/main/res/drawable-hdpi/he515.png b/app/src/main/res/drawable-hdpi/he515.png index 518137a..0ea5946 100644 Binary files a/app/src/main/res/drawable-hdpi/he515.png and b/app/src/main/res/drawable-hdpi/he515.png differ diff --git a/app/src/main/res/drawable-hdpi/he900.png b/app/src/main/res/drawable-hdpi/he900.png index 020b8e3..f436010 100644 Binary files a/app/src/main/res/drawable-hdpi/he900.png and b/app/src/main/res/drawable-hdpi/he900.png differ diff --git a/app/src/main/res/drawable-hdpi/he901.png b/app/src/main/res/drawable-hdpi/he901.png index df59561..1c8a390 100644 Binary files a/app/src/main/res/drawable-hdpi/he901.png and b/app/src/main/res/drawable-hdpi/he901.png differ diff --git a/app/src/main/res/drawable-hdpi/he999.png b/app/src/main/res/drawable-hdpi/he999.png index bb0c9f9..2a1752b 100644 Binary files a/app/src/main/res/drawable-hdpi/he999.png and b/app/src/main/res/drawable-hdpi/he999.png differ diff --git a/app/src/main/res/drawable-hdpi/home_icon_dialer.png b/app/src/main/res/drawable-hdpi/home_icon_dialer.png index 908bebb..ea7f6bf 100644 Binary files a/app/src/main/res/drawable-hdpi/home_icon_dialer.png and b/app/src/main/res/drawable-hdpi/home_icon_dialer.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_alarm.png b/app/src/main/res/drawable-hdpi/icon_alarm.png new file mode 100644 index 0000000..ecd1156 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_alarm.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_call_incoming.png b/app/src/main/res/drawable-hdpi/icon_call_incoming.png index 484aa46..aee0ded 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_call_incoming.png and b/app/src/main/res/drawable-hdpi/icon_call_incoming.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_call_missed.png b/app/src/main/res/drawable-hdpi/icon_call_missed.png index ae7a67f..a8655ce 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_call_missed.png and b/app/src/main/res/drawable-hdpi/icon_call_missed.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_call_outgoing.png b/app/src/main/res/drawable-hdpi/icon_call_outgoing.png index 12dd83c..5c28f7f 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_call_outgoing.png and b/app/src/main/res/drawable-hdpi/icon_call_outgoing.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_call_phone.png b/app/src/main/res/drawable-hdpi/icon_call_phone.png deleted file mode 100644 index 481115b..0000000 Binary files a/app/src/main/res/drawable-hdpi/icon_call_phone.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/icon_contact_add.png b/app/src/main/res/drawable-hdpi/icon_contact_add.png index 397641e..0c5fc72 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_contact_add.png and b/app/src/main/res/drawable-hdpi/icon_contact_add.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_location.png b/app/src/main/res/drawable-hdpi/icon_location.png index ab55c2a..665df11 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_location.png and b/app/src/main/res/drawable-hdpi/icon_location.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_settings.png b/app/src/main/res/drawable-hdpi/icon_settings.png new file mode 100644 index 0000000..514dfde Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_settings.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_sos_cancel.png b/app/src/main/res/drawable-hdpi/icon_sos_cancel.png new file mode 100644 index 0000000..925216e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/icon_sos_cancel.png differ diff --git a/app/src/main/res/drawable-hdpi/icon_sos_dialer.png b/app/src/main/res/drawable-hdpi/icon_sos_dialer.png index a999b60..b956f24 100644 Binary files a/app/src/main/res/drawable-hdpi/icon_sos_dialer.png and b/app/src/main/res/drawable-hdpi/icon_sos_dialer.png differ diff --git a/app/src/main/res/drawable-hdpi/number_delete.png b/app/src/main/res/drawable-hdpi/number_delete.png index 84bb9ce..872bc3b 100644 Binary files a/app/src/main/res/drawable-hdpi/number_delete.png and b/app/src/main/res/drawable-hdpi/number_delete.png differ diff --git a/app/src/main/res/drawable-hdpi/setting_icon_add_contact.png b/app/src/main/res/drawable-hdpi/setting_icon_add_contact.png deleted file mode 100644 index c04d48e..0000000 Binary files a/app/src/main/res/drawable-hdpi/setting_icon_add_contact.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/setting_icon_bind.png b/app/src/main/res/drawable-hdpi/setting_icon_bind.png deleted file mode 100644 index a1c2394..0000000 Binary files a/app/src/main/res/drawable-hdpi/setting_icon_bind.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/setting_icon_network.png b/app/src/main/res/drawable-hdpi/setting_icon_network.png deleted file mode 100644 index 72ea1b8..0000000 Binary files a/app/src/main/res/drawable-hdpi/setting_icon_network.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/setting_icon_wifi.png b/app/src/main/res/drawable-hdpi/setting_icon_wifi.png deleted file mode 100644 index 458da6e..0000000 Binary files a/app/src/main/res/drawable-hdpi/setting_icon_wifi.png and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/sim_card_1.png b/app/src/main/res/drawable-hdpi/sim_card_1.png index f44a522..ada7e6a 100644 Binary files a/app/src/main/res/drawable-hdpi/sim_card_1.png and b/app/src/main/res/drawable-hdpi/sim_card_1.png differ diff --git a/app/src/main/res/drawable-hdpi/sim_card_2.png b/app/src/main/res/drawable-hdpi/sim_card_2.png index 7d1b9f8..aeca504 100644 Binary files a/app/src/main/res/drawable-hdpi/sim_card_2.png and b/app/src/main/res/drawable-hdpi/sim_card_2.png differ diff --git a/app/src/main/res/drawable-xhdpi/he100.png b/app/src/main/res/drawable-xhdpi/he100.png deleted file mode 100644 index faf04c8..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he100.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he101.png b/app/src/main/res/drawable-xhdpi/he101.png deleted file mode 100644 index 17841e4..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he101.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he102.png b/app/src/main/res/drawable-xhdpi/he102.png deleted file mode 100644 index 51bc5a8..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he102.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he103.png b/app/src/main/res/drawable-xhdpi/he103.png deleted file mode 100644 index 5fd9957..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he103.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he104.png b/app/src/main/res/drawable-xhdpi/he104.png deleted file mode 100644 index 9628fbd..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he104.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he150.png b/app/src/main/res/drawable-xhdpi/he150.png deleted file mode 100644 index eaee769..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he150.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he153.png b/app/src/main/res/drawable-xhdpi/he153.png deleted file mode 100644 index 346a2c2..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he153.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he154.png b/app/src/main/res/drawable-xhdpi/he154.png deleted file mode 100644 index 358be1a..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he154.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he300.png b/app/src/main/res/drawable-xhdpi/he300.png deleted file mode 100644 index 24ba9bc..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he300.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he301.png b/app/src/main/res/drawable-xhdpi/he301.png deleted file mode 100644 index ad65de8..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he301.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he302.png b/app/src/main/res/drawable-xhdpi/he302.png deleted file mode 100644 index 4a018ee..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he302.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he303.png b/app/src/main/res/drawable-xhdpi/he303.png deleted file mode 100644 index aa8d273..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he303.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he304.png b/app/src/main/res/drawable-xhdpi/he304.png deleted file mode 100644 index 3155a49..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he304.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he305.png b/app/src/main/res/drawable-xhdpi/he305.png deleted file mode 100644 index f76f6e3..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he305.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he306.png b/app/src/main/res/drawable-xhdpi/he306.png deleted file mode 100644 index ffb6804..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he306.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he307.png b/app/src/main/res/drawable-xhdpi/he307.png deleted file mode 100644 index 1e33073..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he307.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he308.png b/app/src/main/res/drawable-xhdpi/he308.png deleted file mode 100644 index 2586187..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he308.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he309.png b/app/src/main/res/drawable-xhdpi/he309.png deleted file mode 100644 index 9beebe3..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he309.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he310.png b/app/src/main/res/drawable-xhdpi/he310.png deleted file mode 100644 index 624b04e..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he310.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he311.png b/app/src/main/res/drawable-xhdpi/he311.png deleted file mode 100644 index 5fcc3fc..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he311.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he312.png b/app/src/main/res/drawable-xhdpi/he312.png deleted file mode 100644 index 0e93ff7..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he312.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he313.png b/app/src/main/res/drawable-xhdpi/he313.png deleted file mode 100644 index ba783d6..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he313.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he314.png b/app/src/main/res/drawable-xhdpi/he314.png deleted file mode 100644 index 9e93846..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he314.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he315.png b/app/src/main/res/drawable-xhdpi/he315.png deleted file mode 100644 index 527e6fe..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he315.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he316.png b/app/src/main/res/drawable-xhdpi/he316.png deleted file mode 100644 index 8309afb..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he316.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he317.png b/app/src/main/res/drawable-xhdpi/he317.png deleted file mode 100644 index 2e9a702..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he317.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he318.png b/app/src/main/res/drawable-xhdpi/he318.png deleted file mode 100644 index b99b851..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he318.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he350.png b/app/src/main/res/drawable-xhdpi/he350.png deleted file mode 100644 index a9a0c52..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he350.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he351.png b/app/src/main/res/drawable-xhdpi/he351.png deleted file mode 100644 index f7bdda3..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he351.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he399.png b/app/src/main/res/drawable-xhdpi/he399.png deleted file mode 100644 index 321233b..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he399.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he400.png b/app/src/main/res/drawable-xhdpi/he400.png deleted file mode 100644 index 532879b..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he400.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he401.png b/app/src/main/res/drawable-xhdpi/he401.png deleted file mode 100644 index 4a92fc7..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he401.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he402.png b/app/src/main/res/drawable-xhdpi/he402.png deleted file mode 100644 index ccc2dab..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he402.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he403.png b/app/src/main/res/drawable-xhdpi/he403.png deleted file mode 100644 index da32ebe..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he403.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he404.png b/app/src/main/res/drawable-xhdpi/he404.png deleted file mode 100644 index 99a3d9d..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he404.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he405.png b/app/src/main/res/drawable-xhdpi/he405.png deleted file mode 100644 index c3ac8d4..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he405.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he406.png b/app/src/main/res/drawable-xhdpi/he406.png deleted file mode 100644 index 01348b1..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he406.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he407.png b/app/src/main/res/drawable-xhdpi/he407.png deleted file mode 100644 index 37cdd78..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he407.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he408.png b/app/src/main/res/drawable-xhdpi/he408.png deleted file mode 100644 index f8d216c..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he408.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he409.png b/app/src/main/res/drawable-xhdpi/he409.png deleted file mode 100644 index e7e729b..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he409.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he410.png b/app/src/main/res/drawable-xhdpi/he410.png deleted file mode 100644 index 3e4dcf2..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he410.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he456.png b/app/src/main/res/drawable-xhdpi/he456.png deleted file mode 100644 index 1b080c7..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he456.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he457.png b/app/src/main/res/drawable-xhdpi/he457.png deleted file mode 100644 index 1b610d2..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he457.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he499.png b/app/src/main/res/drawable-xhdpi/he499.png deleted file mode 100644 index c486a59..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he499.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he500.png b/app/src/main/res/drawable-xhdpi/he500.png deleted file mode 100644 index dcecc31..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he500.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he501.png b/app/src/main/res/drawable-xhdpi/he501.png deleted file mode 100644 index 41fba52..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he501.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he502.png b/app/src/main/res/drawable-xhdpi/he502.png deleted file mode 100644 index 6ffda43..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he502.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he503.png b/app/src/main/res/drawable-xhdpi/he503.png deleted file mode 100644 index f7e2296..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he503.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he504.png b/app/src/main/res/drawable-xhdpi/he504.png deleted file mode 100644 index b26ea7b..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he504.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he507.png b/app/src/main/res/drawable-xhdpi/he507.png deleted file mode 100644 index 43b1e6e..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he507.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he508.png b/app/src/main/res/drawable-xhdpi/he508.png deleted file mode 100644 index f932cd9..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he508.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he509.png b/app/src/main/res/drawable-xhdpi/he509.png deleted file mode 100644 index b1a8adb..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he509.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he510.png b/app/src/main/res/drawable-xhdpi/he510.png deleted file mode 100644 index eecaf5d..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he510.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he511.png b/app/src/main/res/drawable-xhdpi/he511.png deleted file mode 100644 index b0bcd8e..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he511.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he512.png b/app/src/main/res/drawable-xhdpi/he512.png deleted file mode 100644 index 0d98a13..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he512.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he513.png b/app/src/main/res/drawable-xhdpi/he513.png deleted file mode 100644 index e1128ff..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he513.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he514.png b/app/src/main/res/drawable-xhdpi/he514.png deleted file mode 100644 index cb9adbc..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he514.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he515.png b/app/src/main/res/drawable-xhdpi/he515.png deleted file mode 100644 index 2faa917..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he515.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he900.png b/app/src/main/res/drawable-xhdpi/he900.png deleted file mode 100644 index cbdb3e7..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he900.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he901.png b/app/src/main/res/drawable-xhdpi/he901.png deleted file mode 100644 index bc6d105..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he901.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/he999.png b/app/src/main/res/drawable-xhdpi/he999.png deleted file mode 100644 index 4ce8569..0000000 Binary files a/app/src/main/res/drawable-xhdpi/he999.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he100.png b/app/src/main/res/drawable-xxhdpi/he100.png deleted file mode 100644 index faf04c8..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he100.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he101.png b/app/src/main/res/drawable-xxhdpi/he101.png deleted file mode 100644 index 17841e4..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he101.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he102.png b/app/src/main/res/drawable-xxhdpi/he102.png deleted file mode 100644 index 51bc5a8..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he102.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he103.png b/app/src/main/res/drawable-xxhdpi/he103.png deleted file mode 100644 index 5fd9957..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he103.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he104.png b/app/src/main/res/drawable-xxhdpi/he104.png deleted file mode 100644 index 9628fbd..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he104.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he150.png b/app/src/main/res/drawable-xxhdpi/he150.png deleted file mode 100644 index eaee769..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he150.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he153.png b/app/src/main/res/drawable-xxhdpi/he153.png deleted file mode 100644 index 346a2c2..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he153.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he154.png b/app/src/main/res/drawable-xxhdpi/he154.png deleted file mode 100644 index 358be1a..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he154.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he300.png b/app/src/main/res/drawable-xxhdpi/he300.png deleted file mode 100644 index 24ba9bc..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he300.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he301.png b/app/src/main/res/drawable-xxhdpi/he301.png deleted file mode 100644 index ad65de8..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he301.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he302.png b/app/src/main/res/drawable-xxhdpi/he302.png deleted file mode 100644 index 4a018ee..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he302.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he303.png b/app/src/main/res/drawable-xxhdpi/he303.png deleted file mode 100644 index aa8d273..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he303.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he304.png b/app/src/main/res/drawable-xxhdpi/he304.png deleted file mode 100644 index 3155a49..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he304.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he305.png b/app/src/main/res/drawable-xxhdpi/he305.png deleted file mode 100644 index f76f6e3..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he305.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he306.png b/app/src/main/res/drawable-xxhdpi/he306.png deleted file mode 100644 index ffb6804..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he306.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he307.png b/app/src/main/res/drawable-xxhdpi/he307.png deleted file mode 100644 index 1e33073..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he307.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he308.png b/app/src/main/res/drawable-xxhdpi/he308.png deleted file mode 100644 index 2586187..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he308.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he309.png b/app/src/main/res/drawable-xxhdpi/he309.png deleted file mode 100644 index 9beebe3..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he309.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he310.png b/app/src/main/res/drawable-xxhdpi/he310.png deleted file mode 100644 index 624b04e..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he310.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he311.png b/app/src/main/res/drawable-xxhdpi/he311.png deleted file mode 100644 index 5fcc3fc..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he311.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he312.png b/app/src/main/res/drawable-xxhdpi/he312.png deleted file mode 100644 index 0e93ff7..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he312.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he313.png b/app/src/main/res/drawable-xxhdpi/he313.png deleted file mode 100644 index ba783d6..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he313.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he314.png b/app/src/main/res/drawable-xxhdpi/he314.png deleted file mode 100644 index 9e93846..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he314.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he315.png b/app/src/main/res/drawable-xxhdpi/he315.png deleted file mode 100644 index 527e6fe..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he315.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he316.png b/app/src/main/res/drawable-xxhdpi/he316.png deleted file mode 100644 index 8309afb..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he316.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he317.png b/app/src/main/res/drawable-xxhdpi/he317.png deleted file mode 100644 index 2e9a702..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he317.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he318.png b/app/src/main/res/drawable-xxhdpi/he318.png deleted file mode 100644 index b99b851..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he318.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he350.png b/app/src/main/res/drawable-xxhdpi/he350.png deleted file mode 100644 index a9a0c52..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he350.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he351.png b/app/src/main/res/drawable-xxhdpi/he351.png deleted file mode 100644 index f7bdda3..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he351.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he399.png b/app/src/main/res/drawable-xxhdpi/he399.png deleted file mode 100644 index 321233b..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he399.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he400.png b/app/src/main/res/drawable-xxhdpi/he400.png deleted file mode 100644 index 532879b..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he400.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he401.png b/app/src/main/res/drawable-xxhdpi/he401.png deleted file mode 100644 index 4a92fc7..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he401.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he402.png b/app/src/main/res/drawable-xxhdpi/he402.png deleted file mode 100644 index ccc2dab..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he402.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he403.png b/app/src/main/res/drawable-xxhdpi/he403.png deleted file mode 100644 index da32ebe..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he403.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he404.png b/app/src/main/res/drawable-xxhdpi/he404.png deleted file mode 100644 index 99a3d9d..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he404.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he405.png b/app/src/main/res/drawable-xxhdpi/he405.png deleted file mode 100644 index c3ac8d4..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he405.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he406.png b/app/src/main/res/drawable-xxhdpi/he406.png deleted file mode 100644 index 01348b1..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he406.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he407.png b/app/src/main/res/drawable-xxhdpi/he407.png deleted file mode 100644 index 37cdd78..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he407.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he408.png b/app/src/main/res/drawable-xxhdpi/he408.png deleted file mode 100644 index f8d216c..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he408.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he409.png b/app/src/main/res/drawable-xxhdpi/he409.png deleted file mode 100644 index e7e729b..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he409.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he410.png b/app/src/main/res/drawable-xxhdpi/he410.png deleted file mode 100644 index 3e4dcf2..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he410.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he456.png b/app/src/main/res/drawable-xxhdpi/he456.png deleted file mode 100644 index 1b080c7..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he456.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he457.png b/app/src/main/res/drawable-xxhdpi/he457.png deleted file mode 100644 index 1b610d2..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he457.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he499.png b/app/src/main/res/drawable-xxhdpi/he499.png deleted file mode 100644 index c486a59..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he499.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he500.png b/app/src/main/res/drawable-xxhdpi/he500.png deleted file mode 100644 index dcecc31..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he500.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he501.png b/app/src/main/res/drawable-xxhdpi/he501.png deleted file mode 100644 index 41fba52..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he501.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he502.png b/app/src/main/res/drawable-xxhdpi/he502.png deleted file mode 100644 index 6ffda43..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he502.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he503.png b/app/src/main/res/drawable-xxhdpi/he503.png deleted file mode 100644 index f7e2296..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he503.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he504.png b/app/src/main/res/drawable-xxhdpi/he504.png deleted file mode 100644 index b26ea7b..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he504.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he507.png b/app/src/main/res/drawable-xxhdpi/he507.png deleted file mode 100644 index 43b1e6e..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he507.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he508.png b/app/src/main/res/drawable-xxhdpi/he508.png deleted file mode 100644 index f932cd9..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he508.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he509.png b/app/src/main/res/drawable-xxhdpi/he509.png deleted file mode 100644 index b1a8adb..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he509.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he510.png b/app/src/main/res/drawable-xxhdpi/he510.png deleted file mode 100644 index eecaf5d..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he510.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he511.png b/app/src/main/res/drawable-xxhdpi/he511.png deleted file mode 100644 index b0bcd8e..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he511.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he512.png b/app/src/main/res/drawable-xxhdpi/he512.png deleted file mode 100644 index 0d98a13..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he512.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he513.png b/app/src/main/res/drawable-xxhdpi/he513.png deleted file mode 100644 index e1128ff..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he513.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he514.png b/app/src/main/res/drawable-xxhdpi/he514.png deleted file mode 100644 index cb9adbc..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he514.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he515.png b/app/src/main/res/drawable-xxhdpi/he515.png deleted file mode 100644 index 2faa917..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he515.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he900.png b/app/src/main/res/drawable-xxhdpi/he900.png deleted file mode 100644 index cbdb3e7..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he900.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he901.png b/app/src/main/res/drawable-xxhdpi/he901.png deleted file mode 100644 index bc6d105..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he901.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/he999.png b/app/src/main/res/drawable-xxhdpi/he999.png deleted file mode 100644 index 4ce8569..0000000 Binary files a/app/src/main/res/drawable-xxhdpi/he999.png and /dev/null differ diff --git a/app/src/main/res/drawable/background_weather.xml b/app/src/main/res/drawable/background_weather.xml new file mode 100644 index 0000000..5cab915 --- /dev/null +++ b/app/src/main/res/drawable/background_weather.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/notice_voice_background.xml b/app/src/main/res/drawable/notice_voice_background.xml index d69f3e7..4ab35c8 100644 --- a/app/src/main/res/drawable/notice_voice_background.xml +++ b/app/src/main/res/drawable/notice_voice_background.xml @@ -4,14 +4,14 @@ + android:bottomLeftRadius="8dp" + android:bottomRightRadius="8dp" + android:topLeftRadius="8dp" + android:topRightRadius="8dp" /> + android:top="8dp" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ok_background.xml b/app/src/main/res/drawable/ok_background.xml index d219707..f63ac06 100644 --- a/app/src/main/res/drawable/ok_background.xml +++ b/app/src/main/res/drawable/ok_background.xml @@ -2,12 +2,11 @@ + - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_contact_add.xml b/app/src/main/res/layout/activity_contact_add.xml index 440b154..657be28 100644 --- a/app/src/main/res/layout/activity_contact_add.xml +++ b/app/src/main/res/layout/activity_contact_add.xml @@ -80,7 +80,9 @@ android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" + android:adjustViewBounds="true" android:onClick="@{click::selectPic}" + android:scaleType="centerCrop" android:src="@drawable/default_avatar" app:is_circle="true" app:layout_constraintBottom_toBottomOf="parent" @@ -283,9 +285,9 @@ diff --git a/app/src/main/res/layout/activity_contact_edit.xml b/app/src/main/res/layout/activity_contact_edit.xml index eafe62e..bc7f0b7 100644 --- a/app/src/main/res/layout/activity_contact_edit.xml +++ b/app/src/main/res/layout/activity_contact_edit.xml @@ -100,7 +100,9 @@ android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" + android:adjustViewBounds="true" android:onClick="@{click::selectPic}" + android:scaleType="centerCrop" android:src="@drawable/default_avatar" app:is_circle="true" app:layout_constraintBottom_toBottomOf="parent" @@ -305,9 +307,9 @@ diff --git a/app/src/main/res/layout/activity_emergency.xml b/app/src/main/res/layout/activity_emergency.xml index 003e949..bce195d 100644 --- a/app/src/main/res/layout/activity_emergency.xml +++ b/app/src/main/res/layout/activity_emergency.xml @@ -22,130 +22,72 @@ android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" - android:background="@drawable/bt_sos_bg" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_info_details.xml b/app/src/main/res/layout/activity_info_details.xml index 240cd92..859ed25 100644 --- a/app/src/main/res/layout/activity_info_details.xml +++ b/app/src/main/res/layout/activity_info_details.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + @@ -10,8 +11,8 @@ + android:layout_height="match_parent" + android:background="@color/white"> @@ -39,13 +40,13 @@ android:layout_marginTop="8dp" android:gravity="center" android:maxLines="2" - app:setTime="@{articleInfo.update_time}" android:text="2004/01/24" android:textColor="@color/black" android:textSize="12sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/tv_title" /> + app:layout_constraintTop_toBottomOf="@+id/tv_title" + app:setTime="@{articleInfo.update_time}" /> diff --git a/app/src/main/res/layout/activity_notice.xml b/app/src/main/res/layout/activity_notice.xml index 3abf2b3..9cac05d 100644 --- a/app/src/main/res/layout/activity_notice.xml +++ b/app/src/main/res/layout/activity_notice.xml @@ -20,7 +20,6 @@ android:background="@drawable/bg_dialog" android:minWidth="240dp" android:orientation="vertical" - android:paddingTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -30,62 +29,43 @@ android:id="@+id/linearLayout2" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="16dp" android:gravity="center" android:orientation="horizontal" - app:layout_constraintBottom_toTopOf="@+id/message" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> - - - + app:layout_constraintTop_toBottomOf="@+id/linearLayout2" /> + android:layout_marginBottom="16dp" + app:layout_constraintBottom_toBottomOf="parent"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_info.xml b/app/src/main/res/layout/activity_notice_info.xml index 1277f7d..6bc1554 100644 --- a/app/src/main/res/layout/activity_notice_info.xml +++ b/app/src/main/res/layout/activity_notice_info.xml @@ -15,134 +15,114 @@ - + + + + + + - + + + + + + - - - + - - - - - - - - - - - - - + app:layout_constraintStart_toStartOf="parent" /> -