From 261016b9bd59ac8622ac580f802cf3e62dde10c1 Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Mon, 19 Aug 2024 10:30:50 +0800 Subject: [PATCH] =?UTF-8?q?version:1.1.5=20update:=20bugfixes:=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=97=B9=E9=92=9F=E8=87=AA=E5=8A=A8=E6=8E=A5=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 42 +++- .../aidl/com/xxpatx/sn/IGetInfoInterface.aidl | 26 -- .../activation/ActivationActivity.java | 65 +++++ .../activation/ActivationViewModel.java | 19 ++ .../alarm/port/PortAlarmActivity.java | 14 +- .../add/port/PortAlarmClockAddActivity.java | 21 +- .../callwechat/CallWechatActivity.java | 50 +++- .../activity/contact/AddContactActivity.java | 4 +- .../contact/AddWechatContactActivity.java | 90 +++++-- .../activity/contact/EditContactActivity.java | 4 +- .../os/activity/control/ControlActivity.java | 17 +- .../activity/dailyapp/DailyAppActivity.java | 43 +++- .../activity/dailyapp/DailyAppViewModel.java | 17 ++ .../activity/emergency/EmergencyActivity.java | 24 +- .../xxpatx/os/activity/main/MainActivity.java | 120 +++++++-- .../os/activity/main/MainViewModel.java | 100 +++++++- .../screenlock/ScreenLockActivity.java | 3 +- .../os/activity/setting/SettingActivity.java | 51 +++- .../os/activity/setting/SettingViewModel.java | 48 ++++ .../os/activity/update/UpdateActivity.java | 85 +++++++ .../os/activity/update/UpdateViewModel.java | 18 ++ .../os/activity/weather/WeatherViewModel.java | 5 +- .../xxpatx/os/adapter/CallRecordAdapter.java | 17 +- .../com/xxpatx/os/adapter/ContactAdapter.java | 12 +- .../xxpatx/os/adapter/DailyAppAdapter.java | 13 + .../os/adapter/WechatContactAdapter.java | 11 +- .../com/xxpatx/os/base/BaseApplication.java | 7 +- .../com/xxpatx/os/bean/ActivationBean.java | 48 ++++ .../main/java/com/xxpatx/os/bean/AppInfo.java | 235 ++++++++++++++++++ .../xxpatx/os/dialog/EditContactDialog.java | 9 + .../os/fragment/app/AppListFragment.java | 36 ++- .../os/fragment/contact/ContactFragment.java | 33 +++ .../os/fragment/control/ControlFragment.java | 34 +-- .../xxpatx/os/fragment/home/HomeFragment.java | 3 +- .../phone/contact/ContactFragment.java | 14 +- .../fragment/phone/dialer/DialerFragment.java | 45 +++- .../xxpatx/os/manager/AppStatusManager.java | 17 +- .../com/xxpatx/os/manager/RemoteManager.java | 195 --------------- .../os/network/NetInterfaceManager.java | 99 +++++--- .../com/xxpatx/os/network/UrlAddress.java | 5 +- .../xxpatx/os/network/api/uiui/AppUpdate.java | 18 ++ .../network/api/uiui/SnIsActivationApi.java | 16 ++ .../api/uiui/alarmclock/AlarmClockAddApi.java | 5 + .../os/service/NotificationService.java | 9 +- .../os/service/WeAccessibilityService.java | 5 +- .../os/service/main/MainSPresenter.java | 134 +++++----- .../xxpatx/os/service/main/MainService.java | 42 +++- .../java/com/xxpatx/os/utils/ApkUtils.java | 204 +++++++++++++++ .../java/com/xxpatx/os/utils/JGYUtils.java | 43 ---- .../java/com/xxpatx/os/utils/WiFiUtils.java | 18 +- .../java/com/xxpatx/os/view/ToggleButton.java | 8 +- .../res/drawable-hdpi/add_contact_back.png | Bin 2332 -> 625 bytes .../main/res/drawable-hdpi/default_avatar.png | Bin 3861 -> 8557 bytes .../main/res/drawable-hdpi/home_icon_sos.png | Bin 6820 -> 11191 bytes .../res/drawable-hdpi/icon_call_incoming.png | Bin 0 -> 1213 bytes .../res/drawable-hdpi/icon_call_missed.png | Bin 0 -> 1218 bytes .../res/drawable-hdpi/icon_call_outgoing.png | Bin 0 -> 1181 bytes .../res/drawable-hdpi/icon_delete_contact.png | Bin 1926 -> 903 bytes .../res/drawable-hdpi/icon_edit_contact.png | Bin 1849 -> 1050 bytes .../main/res/drawable-hdpi/icon_incoming.png | Bin 2099 -> 0 bytes .../drawable-hdpi/icon_location_refresh.png | Bin 0 -> 1093 bytes app/src/main/res/drawable-hdpi/icon_menu.png | Bin 0 -> 689 bytes .../main/res/drawable-hdpi/icon_missed.png | Bin 1795 -> 0 bytes .../main/res/drawable-hdpi/icon_outgoing.png | Bin 2048 -> 0 bytes .../res/drawable-hdpi/icon_record_remove.png | Bin 0 -> 1373 bytes .../main/res/drawable-hdpi/icon_remove.png | Bin 857 -> 0 bytes .../res/drawable-hdpi/icon_sos_dialer.png | Bin 0 -> 2278 bytes .../add_wechat_contact_background.xml | 2 +- app/src/main/res/drawable/badge_bg.xml | 8 +- .../main/res/drawable/dialog_background.xml | 9 + .../res/drawable/sos_dialer_background.xml | 13 + .../res/drawable/tv_activation_normnl.xml | 17 ++ .../main/res/drawable/update_background.xml | 13 + .../res/drawable/update_cancel_background.xml | 13 + .../main/res/layout/activity_activation.xml | 84 +++++++ .../res/layout/activity_add_alarm_port.xml | 1 + .../main/res/layout/activity_add_contact.xml | 31 +-- .../layout/activity_add_wechat_contact.xml | 62 +++-- .../main/res/layout/activity_alarm_port.xml | 2 + app/src/main/res/layout/activity_dailyapp.xml | 4 + .../main/res/layout/activity_edit_contact.xml | 33 +-- .../main/res/layout/activity_emergency.xml | 64 ++++- app/src/main/res/layout/activity_main.xml | 78 +++++- app/src/main/res/layout/activity_setting.xml | 92 +++++-- app/src/main/res/layout/activity_touch.xml | 18 +- app/src/main/res/layout/activity_update.xml | 164 ++++++++++++ .../main/res/layout/activity_wechat_call.xml | 21 +- app/src/main/res/layout/fragment_applist.xml | 86 ++++--- app/src/main/res/layout/fragment_contact.xml | 4 +- app/src/main/res/layout/fragment_home.xml | 3 +- app/src/main/res/layout/fragment_record.xml | 5 +- app/src/main/res/layout/fragment_settings.xml | 25 +- app/src/main/res/layout/item_call_record.xml | 38 ++- app/src/main/res/layout/item_contact.xml | 53 ++-- .../main/res/layout/item_contact_wechat.xml | 6 +- app/src/main/res/layout/item_daily_app.xml | 24 +- app/src/main/res/layout/item_sosnumber.xml | 19 +- app/src/main/res/values/colors.xml | 7 +- app/src/main/res/values/styles.xml | 32 ++- app/src/main/res/xml/file_paths.xml | 18 ++ build.gradle | 2 +- 103 files changed, 2478 insertions(+), 781 deletions(-) delete mode 100644 app/src/main/aidl/com/xxpatx/sn/IGetInfoInterface.aidl create mode 100644 app/src/main/java/com/xxpatx/os/activity/activation/ActivationActivity.java create mode 100644 app/src/main/java/com/xxpatx/os/activity/activation/ActivationViewModel.java create mode 100644 app/src/main/java/com/xxpatx/os/activity/update/UpdateActivity.java create mode 100644 app/src/main/java/com/xxpatx/os/activity/update/UpdateViewModel.java create mode 100644 app/src/main/java/com/xxpatx/os/bean/ActivationBean.java create mode 100644 app/src/main/java/com/xxpatx/os/bean/AppInfo.java delete mode 100644 app/src/main/java/com/xxpatx/os/manager/RemoteManager.java create mode 100644 app/src/main/java/com/xxpatx/os/network/api/uiui/AppUpdate.java create mode 100644 app/src/main/java/com/xxpatx/os/network/api/uiui/SnIsActivationApi.java delete mode 100644 app/src/main/java/com/xxpatx/os/utils/JGYUtils.java create mode 100644 app/src/main/res/drawable-hdpi/icon_call_incoming.png create mode 100644 app/src/main/res/drawable-hdpi/icon_call_missed.png create mode 100644 app/src/main/res/drawable-hdpi/icon_call_outgoing.png delete mode 100644 app/src/main/res/drawable-hdpi/icon_incoming.png create mode 100644 app/src/main/res/drawable-hdpi/icon_location_refresh.png create mode 100644 app/src/main/res/drawable-hdpi/icon_menu.png delete mode 100644 app/src/main/res/drawable-hdpi/icon_missed.png delete mode 100644 app/src/main/res/drawable-hdpi/icon_outgoing.png create mode 100644 app/src/main/res/drawable-hdpi/icon_record_remove.png delete mode 100644 app/src/main/res/drawable-hdpi/icon_remove.png create mode 100644 app/src/main/res/drawable-hdpi/icon_sos_dialer.png create mode 100644 app/src/main/res/drawable/dialog_background.xml create mode 100644 app/src/main/res/drawable/sos_dialer_background.xml create mode 100644 app/src/main/res/drawable/tv_activation_normnl.xml create mode 100644 app/src/main/res/drawable/update_background.xml create mode 100644 app/src/main/res/drawable/update_cancel_background.xml create mode 100644 app/src/main/res/layout/activity_activation.xml create mode 100644 app/src/main/res/layout/activity_update.xml create mode 100644 app/src/main/res/xml/file_paths.xml diff --git a/.gitignore b/.gitignore index 6ed3b0e..486e39a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ /app/src/test/java/com/uiui/os/ /.idea/ /app/proguardbuild/ +/dependencies.txt diff --git a/app/build.gradle b/app/build.gradle index f7e92f0..b10f30d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.xxpatx.os" minSdkVersion 24 targetSdkVersion 29 - versionCode 1010 - versionName "1.0.9" + versionCode 1016 + versionName "1.1.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -27,7 +27,7 @@ android { } manifestPlaceholders = [ - AMAP_KEY: "723704391181f6b0b478eecf8e6fcde6" + AMAP_KEY: "963a156c0e1b525856d9b1d304666fe9" ] } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a820608..1085e14 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -124,15 +124,15 @@ android:requestLegacyExternalStorage="true" android:restoreAnyVersion="true" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppThemeFitsSystem"> + android:resizeableActivity="true" + android:screenOrientation="portrait" + android:theme="@style/AppTheme"> @@ -143,7 +143,11 @@ - + - + - - @@ -336,6 +339,21 @@ + + + + + + { + private static final String TAG = "ActivationActivity"; + + @Override + public boolean setNightMode() { + return true; + } + + @Override + public int getLayoutId() { + return R.layout.activity_activation; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + public void initView() { + + } + + @Override + public void initData() { + + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { + return false; + } + return super.onKeyDown(keyCode, event); + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + + public void activation(View view) { + ApkUtils.openApp(ActivationActivity.this, "com.xxpatx.sn"); + } + + public void openWifi(View view) { + startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); + } + } +} diff --git a/app/src/main/java/com/xxpatx/os/activity/activation/ActivationViewModel.java b/app/src/main/java/com/xxpatx/os/activity/activation/ActivationViewModel.java new file mode 100644 index 0000000..04d6c5d --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/activity/activation/ActivationViewModel.java @@ -0,0 +1,19 @@ +package com.xxpatx.os.activity.activation; + +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.xxpatx.os.base.mvvm.BaseViewModel; +import com.xxpatx.os.databinding.ActivityActivationBinding; + +public class ActivationViewModel extends BaseViewModel { + + @Override + public ActivityActivationBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } + +} diff --git a/app/src/main/java/com/xxpatx/os/activity/alarm/port/PortAlarmActivity.java b/app/src/main/java/com/xxpatx/os/activity/alarm/port/PortAlarmActivity.java index a87da96..6760167 100644 --- a/app/src/main/java/com/xxpatx/os/activity/alarm/port/PortAlarmActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/alarm/port/PortAlarmActivity.java @@ -38,6 +38,11 @@ public class PortAlarmActivity extends BaseMvvmActivity { @@ -38,6 +41,17 @@ public class CallWechatActivity extends BaseMvvmActivity params = new HashMap<>(); - params.put("sn", RemoteManager.getInstance().getSerial()); + params.put("sn", Utils.getSerial()); params.put("name", name); params.put("mobile", phone); params.put("is_urgent", String.valueOf(mViewDataBinding.toggleButton.isToggleOn())); diff --git a/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java b/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java index c3f8d41..066c2a3 100644 --- a/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/contact/AddWechatContactActivity.java @@ -1,11 +1,14 @@ package com.xxpatx.os.activity.contact; import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; +import android.provider.ContactsContract; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Log; @@ -21,14 +24,14 @@ import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.interfaces.OnResultCallbackListener; +import com.xiasuhuei321.loadingdialog.view.LoadingDialog; import com.xxpatx.os.R; import com.xxpatx.os.base.GlideEngine; import com.xxpatx.os.base.mvvm.BaseMvvmActivity; import com.xxpatx.os.bean.BaseResponse; import com.xxpatx.os.databinding.ActivityAddWechatContactBinding; -import com.xxpatx.os.manager.RemoteManager; import com.xxpatx.os.utils.ScreenUtil; -import com.xiasuhuei321.loadingdialog.view.LoadingDialog; +import com.xxpatx.os.utils.Utils; import java.io.File; import java.io.FileOutputStream; @@ -46,6 +49,11 @@ public class AddWechatContactActivity extends BaseMvvmActivity params = new HashMap<>(); + params.put("sn", Utils.getSerial()); + params.put("name", name); + params.put("mobile", phone); + params.put("tag", groupTag); + params.put("is_urgent", String.valueOf(mViewDataBinding.toggleButton.isToggleOn())); + mViewModel.addContact(params, body); } - MediaType mediaType = MediaType.Companion.parse("image/png"); - RequestBody requestBody = RequestBody.Companion.create(avatarFile, mediaType); - MultipartBody.Part body = MultipartBody.Part.createFormData("avatar", avatarFile.getName(), requestBody); - Map params = new HashMap<>(); - params.put("sn", RemoteManager.getInstance().getSerial()); - params.put("name", name); - params.put("mobile", phone); - params.put("tag", groupTag); - params.put("is_urgent", String.valueOf(mViewDataBinding.toggleButton.isToggleOn())); - mViewModel.addContact(params, body); + mLoadingDialog.show(); } @@ -234,6 +247,47 @@ public class AddWechatContactActivity extends BaseMvvmActivity params = new HashMap<>(); - params.put("sn", RemoteManager.getInstance().getSerial()); + params.put("sn", Utils.getSerial()); params.put("id", mContact.getId()); params.put("name", name); params.put("mobile", phone); diff --git a/app/src/main/java/com/xxpatx/os/activity/control/ControlActivity.java b/app/src/main/java/com/xxpatx/os/activity/control/ControlActivity.java index dcdfbee..3f318b0 100644 --- a/app/src/main/java/com/xxpatx/os/activity/control/ControlActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/control/ControlActivity.java @@ -30,7 +30,6 @@ import com.xxpatx.os.base.mvvm.BaseMvvmActivity; import com.xxpatx.os.config.CommonConfig; import com.xxpatx.os.databinding.ActivityControlBinding; import com.xxpatx.os.manager.AmapManager; -import com.xxpatx.os.manager.RemoteManager; import com.xxpatx.os.utils.BrightnessUtils; import java.lang.reflect.InvocationTargetException; @@ -204,20 +203,6 @@ public class ControlActivity extends BaseMvvmActivity appBeanList = AppStatusManager.getInstance().getPackageList(); - mDailyAppAdapter.setDailyAppBeans(appBeanList); - mViewDataBinding.tvAppsize.setText(String.format(getString(R.string.app_size), appBeanList.size())); + mViewModel.getDailyAppData().observe(this, new Observer>() { + @Override + public void onChanged(List dailyAppBeans) { + mDailyAppAdapter.setDailyAppBeans(dailyAppBeans); + mViewDataBinding.tvAppsize.setText(String.format(getString(R.string.app_size), dailyAppBeans.size())); + } + }); + mViewModel.getPackageList(); } -} + @Override + protected void onResume() { + super.onResume(); + } + + public class BtnClick { + public void exit(View view) { + finish(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/xxpatx/os/activity/dailyapp/DailyAppViewModel.java b/app/src/main/java/com/xxpatx/os/activity/dailyapp/DailyAppViewModel.java index ff885be..325e0f9 100644 --- a/app/src/main/java/com/xxpatx/os/activity/dailyapp/DailyAppViewModel.java +++ b/app/src/main/java/com/xxpatx/os/activity/dailyapp/DailyAppViewModel.java @@ -1,8 +1,14 @@ package com.xxpatx.os.activity.dailyapp; +import androidx.lifecycle.MutableLiveData; + import com.trello.rxlifecycle4.android.ActivityEvent; import com.xxpatx.os.base.mvvm.BaseViewModel; +import com.xxpatx.os.bean.DailyAppBean; import com.xxpatx.os.databinding.ActivityDailyappBinding; +import com.xxpatx.os.manager.AppStatusManager; + +import java.util.List; public class DailyAppViewModel extends BaseViewModel { @@ -15,4 +21,15 @@ public class DailyAppViewModel extends BaseViewModel> mDailyAppData = new MutableLiveData<>(); + + public MutableLiveData> getDailyAppData() { + return mDailyAppData; + } + + public void getPackageList() { + List appBeanList = AppStatusManager.getInstance().getPackageList(); + mDailyAppData.setValue(appBeanList); + } } diff --git a/app/src/main/java/com/xxpatx/os/activity/emergency/EmergencyActivity.java b/app/src/main/java/com/xxpatx/os/activity/emergency/EmergencyActivity.java index c371488..0b2efcf 100644 --- a/app/src/main/java/com/xxpatx/os/activity/emergency/EmergencyActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/emergency/EmergencyActivity.java @@ -57,7 +57,7 @@ public class EmergencyActivity extends BaseMvvmActivity implements RemoteManager.ConnectedListener, NetworkUtils.OnNetworkStatusChangedListener { +public class MainActivity extends BaseMvvmActivity implements NetworkUtils.OnNetworkStatusChangedListener, NotificationService.NotificationListener { private static final String TAG = "MainActivity"; @@ -102,9 +103,9 @@ public class MainActivity extends BaseMvvmActivity 1) { mViewDataBinding.viewPager.setCurrentItem(defaultCurrent); } + NotificationService.setListener(this); + updateIconBg(); View decorView = getWindow().getDecorView(); decorView.setOnSystemUiVisibilityChangeListener(mOnSystemUiVisibilityChangeListener); @@ -231,6 +231,40 @@ public class MainActivity extends BaseMvvmActivity() { + @Override + public void onChanged(Integer integer) { + if (integer == 0) { + if (WiFiUtils.getInstance().isNetworkConnected()) { + Toaster.showLong("请先激活设备"); + startActivity(new Intent(MainActivity.this, ActivationActivity.class)); + } + } else { + Log.e("getActivationData", "onChanged: 已激活"); + } + } + }); + + mViewModel.getSnIsActivation(); + + mViewModel.getAppInfoData().observe(this, new Observer() { + @Override + public void onChanged(AppInfo appInfo) { + if (appInfo == null) { + Log.e("getAppInfoData", "onChanged: not found update"); + } else { + if (ApkUtils.checkAppUpdate(MainActivity.this, appInfo)) { + Intent intent = new Intent(MainActivity.this, UpdateActivity.class); + intent.putExtra("appUpdateInfo", appInfo); + startActivity(intent); + } else { + Log.e("getAppInfoData", "onChanged: not found update"); + } + } + } + }); + mViewModel.checkUpdate(); registReceiver(); - RemoteManager.setListener(this); initAmap(); } @@ -359,6 +425,7 @@ public class MainActivity extends BaseMvvmActivity mActivationData = new MutableLiveData<>(); + + public MutableLiveData getActivationData() { + return mActivationData; + } + + public void getSnIsActivation() { + NetInterfaceManager.getInstance().getSnIsActivationObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getSnIsActivation", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("getSnIsActivation", "onNext: " + baseResponse); + if (baseResponse.code == 200) { + ActivationBean activationBean = baseResponse.data; + if (activationBean != null) { + MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE).encode(CommonConfig.ACTIVATION_BEAN_KEY, GsonUtils.toJSONString(activationBean)); + int is_activation = activationBean.getIs_activation(); + Settings.Global.putInt(getCtx().getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, is_activation); + int code_type = activationBean.getCode_type(); + Settings.Global.putInt(getCtx().getContentResolver(), CommonConfig.UIUI_CODE_TYPE_KEY, code_type); + long expire_time = activationBean.getExpire_time(); + Settings.Global.putLong(getCtx().getContentResolver(), CommonConfig.UIUI_EXPIRE_TIME_KEY, expire_time); + mActivationData.setValue(is_activation); + } else { + mActivationData.setValue(0); + } + } else { + mActivationData.setValue(0); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getSnIsActivation", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getSnIsActivation", "onComplete: "); + } + }); + } + + private MutableLiveData mAppInfoData = new MutableLiveData<>(); + + public MutableLiveData getAppInfoData() { + return mAppInfoData; + } + + public void checkUpdate() { + NetInterfaceManager.getInstance().getUpdateObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkUpdate", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse appInfoBaseResponse) { + Log.e("checkUpdate", "onNext: " + appInfoBaseResponse); + if (appInfoBaseResponse.code == 200) { + AppInfo appInfo = appInfoBaseResponse.data; + mAppInfoData.setValue(appInfo); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkUpdate", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("checkUpdate", "onComplete: "); + } + }); + } @Deprecated public void getDesktopLayout() { @@ -299,7 +391,7 @@ public class MainViewModel extends BaseViewModel { private static final String TAG = "ScreenLockActivity"; @@ -155,7 +154,7 @@ public class ScreenLockActivity extends BaseMvvmActivity() { + @Override + public void onChanged(AppInfo appInfo) { + if (appInfo == null) { + Log.e("getAppInfoData", "onChanged: not found update"); + Toaster.show("已是最新版本"); + } else { + if (ApkUtils.checkAppUpdate(SettingActivity.this, appInfo)) { + Intent intent = new Intent(SettingActivity.this, UpdateActivity.class); + intent.putExtra("appUpdateInfo", appInfo); + startActivity(intent); + } else { + Log.e("getAppInfoData", "onChanged: not found update"); + Toaster.show("已是最新版本"); + } + } + } + }); } @Override @@ -231,23 +252,23 @@ public class SettingActivity extends BaseMvvmActivity { @@ -15,4 +27,40 @@ public class SettingViewModel extends BaseViewModel mAppInfoData = new MutableLiveData<>(); + + public MutableLiveData getAppInfoData() { + return mAppInfoData; + } + + public void checkUpdate() { + NetInterfaceManager.getInstance().getUpdateObservable() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("checkUpdate", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse appInfoBaseResponse) { + Log.e("checkUpdate", "onNext: " + appInfoBaseResponse); + if (appInfoBaseResponse.code == 200) { + AppInfo appInfo = appInfoBaseResponse.data; + mAppInfoData.setValue(appInfo); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("checkUpdate", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("checkUpdate", "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/xxpatx/os/activity/update/UpdateActivity.java b/app/src/main/java/com/xxpatx/os/activity/update/UpdateActivity.java new file mode 100644 index 0000000..8d8f70b --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/activity/update/UpdateActivity.java @@ -0,0 +1,85 @@ +package com.xxpatx.os.activity.update; + +import android.content.Intent; +import android.view.View; + +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.download.DownloadEntity; +import com.hjq.toast.Toaster; +import com.xxpatx.os.R; +import com.xxpatx.os.base.mvvm.BaseMvvmActivity; +import com.xxpatx.os.bean.AppInfo; +import com.xxpatx.os.databinding.ActivityUpdateBinding; +import com.xxpatx.os.service.main.MainService; +import com.xxpatx.os.utils.ApkUtils; + +import static com.arialyy.aria.core.inf.IEntity.STATE_RUNNING; + +public class UpdateActivity extends BaseMvvmActivity { + + private AppInfo mAppInfoData; + + + @Override + protected int getLayoutId() { + return R.layout.activity_update; + } + + @Override + protected void initDataBinding() { + mViewModel.setCtx(this); + mViewModel.setLifecycle(getLifecycleSubject()); + mViewModel.setVDBinding(mViewDataBinding); + mViewDataBinding.setClick(new BtnClick()); + } + + @Override + protected void initView() { + + } + + @Override + protected void initData() { + Intent intent = getIntent(); + mAppInfoData = (AppInfo) intent.getSerializableExtra("appUpdateInfo"); + mViewDataBinding.setAppInfo(mAppInfoData); + mViewDataBinding.setMsg("检测到新版本,是否更新"); + } + + + public class BtnClick { + public void empty(View view) { + + } + + public void exit(View view) { + finish(); + } + + public void upgrade(View view) { + startService(new Intent(UpdateActivity.this, MainService.class)); + if (mAppInfoData != null) { + DownloadEntity entity = Aria.download(this).getFirstDownloadEntity(mAppInfoData.getApp_url()); + if (null != entity) { + if (entity.isComplete()) { + ApkUtils.installApp(UpdateActivity.this, entity.getFilePath()); + } else { + if (entity.getState() == STATE_RUNNING) { + Toaster.show("文件正在下载中"); + finish(); + } else { + Aria.download(this).resumeAllTask(); + Toaster.show("正在下载"); + finish(); + } + } + } else { + ApkUtils.ariaDownload(UpdateActivity.this, mAppInfoData.getApp_url(), mAppInfoData); + Toaster.show("正在下载更新"); + finish(); + } + } + + } + } +} diff --git a/app/src/main/java/com/xxpatx/os/activity/update/UpdateViewModel.java b/app/src/main/java/com/xxpatx/os/activity/update/UpdateViewModel.java new file mode 100644 index 0000000..e7960c9 --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/activity/update/UpdateViewModel.java @@ -0,0 +1,18 @@ +package com.xxpatx.os.activity.update; + +import com.trello.rxlifecycle4.android.ActivityEvent; +import com.xxpatx.os.base.mvvm.BaseViewModel; +import com.xxpatx.os.databinding.ActivityUpdateBinding; + +public class UpdateViewModel extends BaseViewModel { + + @Override + public ActivityUpdateBinding getVDBinding() { + return binding; + } + + @Override + public void onDestroy() { + + } +} diff --git a/app/src/main/java/com/xxpatx/os/activity/weather/WeatherViewModel.java b/app/src/main/java/com/xxpatx/os/activity/weather/WeatherViewModel.java index 4d9fcf2..5e2f658 100644 --- a/app/src/main/java/com/xxpatx/os/activity/weather/WeatherViewModel.java +++ b/app/src/main/java/com/xxpatx/os/activity/weather/WeatherViewModel.java @@ -25,6 +25,7 @@ import com.xxpatx.os.databinding.ActivityWeatherBinding; import com.xxpatx.os.manager.AmapManager; import com.xxpatx.os.network.NetInterfaceManager; import com.xxpatx.os.utils.ActivationUtil; +import com.xxpatx.os.utils.WiFiUtils; import java.lang.reflect.Type; import java.util.List; @@ -172,7 +173,9 @@ public class WeatherViewModel extends BaseViewModel mRecordsInfoList; - private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("MM/dd HH:mm:ss"); + private SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat("HH:mm"); public void setRecordsInfoList(List recordsInfoList) { this.mRecordsInfoList = recordsInfoList; @@ -63,13 +63,22 @@ public class CallRecordAdapter extends RecyclerView.Adapter(Arrays.asList(new DesktopIcon[CommonConfig.DESKTOP_LIST_SIZE - mDesktopIcons.size()]))); - } + //填充空数据 +// if (mDesktopIcons.size() != CommonConfig.DESKTOP_LIST_SIZE) { +// mDesktopIcons.addAll(new ArrayList<>(Arrays.asList(new DesktopIcon[CommonConfig.DESKTOP_LIST_SIZE - mDesktopIcons.size()]))); +// } + gridLayout = rootView.findViewById(R.id.list); // if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // gridLayout.set(3, 3); // } else { - gridLayout.set(3, 3); + gridLayout.set(2, 3); // } gridLayout.setGridAdapter(new MyGridLayout.GridAdatper() { @@ -146,6 +147,29 @@ public class AppListFragment extends BaseFragment { TextView tv = view.findViewById(R.id.tv); TextView bg = view.findViewById(R.id.bg); ConstraintLayout constraintLayout = view.findViewById(R.id.btn_booktag); + switch (index % 6) { + case 0: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround1)); + break; + case 1: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround2)); + break; + case 2: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround3)); + break; + case 3: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround4)); + break; + case 4: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround5)); + break; + case 5: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround6)); + break; + default: + constraintLayout.setBackground(mContext.getDrawable(R.drawable.contact_card_backround1)); + } + DesktopIcon desktopIcon = mDesktopIcons.get(index); if (desktopIcon != null) { String pkg = desktopIcon.getPackage(); @@ -233,7 +257,7 @@ public class AppListFragment extends BaseFragment { case "aios.exit": int is_activation = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.UIUI_ACTIVATION_KEY, 0); if (is_activation == 0) { - RemoteManager.getInstance().openLauncher3(); +// RemoteManager.getInstance().openLauncher3(); } else { startScreenLockActivity(); } diff --git a/app/src/main/java/com/xxpatx/os/fragment/contact/ContactFragment.java b/app/src/main/java/com/xxpatx/os/fragment/contact/ContactFragment.java index 9bcff68..3eb52e6 100644 --- a/app/src/main/java/com/xxpatx/os/fragment/contact/ContactFragment.java +++ b/app/src/main/java/com/xxpatx/os/fragment/contact/ContactFragment.java @@ -1,7 +1,10 @@ package com.xxpatx.os.fragment.contact; +import android.content.ContentResolver; import android.content.Intent; import android.content.res.Configuration; +import android.database.Cursor; +import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.Gravity; @@ -37,6 +40,7 @@ import com.xxpatx.os.utils.TimeUtils; import com.xxpatx.os.view.EquallyDividedItemDecoration; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -206,6 +210,10 @@ public class ContactFragment extends BaseMvvmFragment sim = getSIMContacts(); + if (sim.size() != 0) { + contacts.addAll(sim); + } } mContactAdapter.setContactList(contacts); } @@ -269,6 +277,31 @@ public class ContactFragment extends BaseMvvmFragment getSIMContacts() { + List contactList = new ArrayList<>(); + ContentResolver resolver = mContext.getContentResolver(); + // 获取Sims卡联系人 + Uri uri = Uri.parse("content://icc/adn"); + Cursor phoneCursor = resolver.query(uri, null, null, null, null); + if (phoneCursor != null) { + final int colName = phoneCursor.getColumnIndex(NAME); + final int colNumber = phoneCursor.getColumnIndex(NUMBER); + while (phoneCursor.moveToNext()) { + String number = phoneCursor.getString(colNumber); + // 当手机号码为空的或者为空字段 跳过当前循环 + String username = phoneCursor.getString(colName); + Log.e(TAG, "getSIMContacts: number = " + number + " username = " + username); + Contact contact = new Contact(username, number, true); + contactList.add(contact); + } + phoneCursor.close(); + } + return contactList; + } + public class BtnClick { public void toAdd(View view) { diff --git a/app/src/main/java/com/xxpatx/os/fragment/control/ControlFragment.java b/app/src/main/java/com/xxpatx/os/fragment/control/ControlFragment.java index 1ea87ee..6d166ef 100644 --- a/app/src/main/java/com/xxpatx/os/fragment/control/ControlFragment.java +++ b/app/src/main/java/com/xxpatx/os/fragment/control/ControlFragment.java @@ -43,7 +43,6 @@ import com.xxpatx.os.bean.FamilyAddress; import com.xxpatx.os.config.CommonConfig; import com.xxpatx.os.databinding.PhoneFragmentControlBinding; import com.xxpatx.os.manager.AmapManager; -import com.xxpatx.os.manager.RemoteManager; import com.xxpatx.os.utils.BrightnessUtils; import java.lang.reflect.InvocationTargetException; @@ -351,20 +350,6 @@ public class ControlFragment extends BaseMvvmFragment mExcludeApp = new HashSet() {{ + this.add("com.android.contacts"); + this.add("com.android.dialer"); + this.add("com.mediatek.camera"); + }}; + + private AppStatusManager(Context context) { if (context == null) { throw new RuntimeException("Context is NULL"); @@ -70,13 +76,13 @@ public class AppStatusManager { public void addHidedApp(String pkg) { this.hidedAppSet.add(pkg); mMMKV.encode(APP_STATUS_MANAGER_KEY, hidedAppSet); -// mContext.sendBroadcast(new Intent(OldMainActivity.ACTION_PACKAGE_HIDE)); + mContext.sendBroadcast(new Intent(MainActivity.ACTION_PACKAGE_HIDE)); } public void removeHidedApp(String pkg) { this.hidedAppSet.remove(pkg); mMMKV.encode(APP_STATUS_MANAGER_KEY, hidedAppSet); -// mContext.sendBroadcast(new Intent(OldMainActivity.ACTION_PACKAGE_HIDE)); + mContext.sendBroadcast(new Intent(MainActivity.ACTION_PACKAGE_HIDE)); } public List getPackageList() { @@ -89,6 +95,9 @@ public class AppStatusManager { List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0); for (ResolveInfo packageInfo : resolveinfoList) { String pkg = packageInfo.activityInfo.packageName; + if (mExcludeApp.contains(pkg)) { + continue; + } if (hidedAppSet.contains(pkg)) { Log.e(TAG, "getPackageList: " + pkg); DailyAppBean appSelectBean = new DailyAppBean(packageInfo.activityInfo.loadLabel(pm).toString(), diff --git a/app/src/main/java/com/xxpatx/os/manager/RemoteManager.java b/app/src/main/java/com/xxpatx/os/manager/RemoteManager.java deleted file mode 100644 index 1e1124c..0000000 --- a/app/src/main/java/com/xxpatx/os/manager/RemoteManager.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.xxpatx.os.manager; - -import android.annotation.SuppressLint; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.Log; - -import com.tencent.bugly.crashreport.CrashReport; -import com.tencent.mmkv.MMKV; -import com.xxpatx.os.config.CommonConfig; -import com.xxpatx.sn.IGetInfoInterface; - -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - -public class RemoteManager { - private static final String TAG = "RemoteManager"; - - private static final String SN_KEY = "sn_serial_key"; - private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); - - @SuppressLint("StaticFieldLeak") - private static RemoteManager sInstance; - private Context mContext; - private static boolean mServiceConnected = false; - - private IGetInfoInterface mIGetInfoInterface; - private ServiceConnection mIGetInfoConnection; - - private RemoteManager(Context context) { - if (context == null) { - throw new RuntimeException("Context is NULL"); - } - this.mContext = context; - mIGetInfoConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - Log.e(TAG, "onServiceConnected: mIGetInfoConnection"); - mIGetInfoInterface = IGetInfoInterface.Stub.asInterface(service); - mServiceConnected = true; - for (ConnectedListener listener : mListeners) { - if (listener != null) { - listener.onRemoteConnected(); - } - } - try { - String sn = mIGetInfoInterface.getSerial(); - CrashReport.setDeviceModel(mContext, sn); - mMMKV.encode(SN_KEY, sn); - Log.e(TAG, "onServiceConnected: sn = " + sn); - } catch (RemoteException e) { - e.printStackTrace(); - } - } - - @Override - public void onServiceDisconnected(ComponentName name) { - Log.e(TAG, "onServiceDisconnected: mIGetInfoConnection"); - mIGetInfoInterface = null; - mServiceConnected = false; - bindInfoService(); - } - }; - bindInfoService(); - } - - public static void init(Context context) { - if (sInstance == null) { - Log.e(TAG, "init: "); - sInstance = new RemoteManager(context); - } - } - - public static RemoteManager getInstance() { - if (sInstance == null) { - throw new IllegalStateException("You must be init RemoteManager first"); - } - return sInstance; - } - - public static boolean isServiceConnected() { - return mServiceConnected; - } - - public interface ConnectedListener { - void onRemoteConnected(); - } - - private static Set mListeners = new CopyOnWriteArraySet<>(); - - public static void setListener(ConnectedListener listener) { - mListeners.add(listener); - if (mServiceConnected) { - listener.onRemoteConnected(); - } - } - - public static void removeListener(ConnectedListener listener) { - mListeners.remove(listener); - } - - public void bindInfoService() { - if (mIGetInfoInterface == null) { - //这是连接aidl服务的代码 - Intent intent = new Intent(); - intent.setAction("com.xxpatx.sn.IGetInfoInterface"); - intent.setPackage("com.xxpatx.sn"); - intent.setComponent(new ComponentName("com.xxpatx.sn", "com.xxpatx.sn.service.RemoteService")); - mContext.bindService(intent, mIGetInfoConnection, Context.BIND_AUTO_CREATE); - } - } - - /** - * @return 获取sn - */ - public String getSerial() { -// if (BuildConfig.DEBUG) return "MTK13220282310"; - if (mIGetInfoInterface != null) { - try { - return mIGetInfoInterface.getSerial(); - } catch (Exception e) { - Log.e(TAG, "getSerial: " + e.getMessage()); - } - } else { - bindInfoService(); - } - return mMMKV.decodeString(SN_KEY, ""); - } - - public boolean putSystemInt(String name, int value) { - if (mIGetInfoInterface != null) { - try { - return mIGetInfoInterface.SystemPutInt(name, value); - } catch (Exception e) { - Log.e(TAG, "putSystemInt: " + e.getMessage()); - } - } else { - bindInfoService(); - } - return false; - } - - public void killBackgroundProcesses(String pkg) { - if (mIGetInfoInterface != null) { - try { - mIGetInfoInterface.killBackgroundProcesses(pkg); - } catch (Exception e) { - Log.e(TAG, "killBackgroundProcesses: " + e.getMessage()); - } - } else { - bindInfoService(); - } - } - - public String getConnectWifiSsid() { - if (mIGetInfoInterface != null) { - try { - return mIGetInfoInterface.getWifiSsid(); - } catch (Exception e) { - Log.e(TAG, "killBackgroundProcesses: " + e.getMessage()); - } - } else { - bindInfoService(); - } - return "获取失败"; - } - - public void openLauncher3() { - if (mIGetInfoInterface != null) { - try { - mIGetInfoInterface.openLauncher3(); - } catch (Exception e) { - Log.e(TAG, "openLauncher3: " + e.getMessage()); - } - } else { - bindInfoService(); - } - } - - public void setDefaultDesktop(String pkgName, String className) { - if (mIGetInfoInterface != null) { - try { - mIGetInfoInterface.setDefaultDesktop(pkgName, className); - } catch (Exception e) { - Log.e(TAG, "setDefaultDesktop: " + e.getMessage()); - } - } else { - bindInfoService(); - } - } -} diff --git a/app/src/main/java/com/xxpatx/os/network/NetInterfaceManager.java b/app/src/main/java/com/xxpatx/os/network/NetInterfaceManager.java index 0a635c6..52c7917 100644 --- a/app/src/main/java/com/xxpatx/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/xxpatx/os/network/NetInterfaceManager.java @@ -15,9 +15,11 @@ import com.uiui.video.bean.VideoInfo; import com.xxpatx.os.BuildConfig; import com.xxpatx.os.alarm.AlarmClockData; import com.xxpatx.os.alarm.AlarmUtils; +import com.xxpatx.os.bean.ActivationBean; import com.xxpatx.os.bean.ActivityBean; import com.xxpatx.os.bean.AddressInfo; import com.xxpatx.os.bean.AlarmClockId; +import com.xxpatx.os.bean.AppInfo; import com.xxpatx.os.bean.ArticleList; import com.xxpatx.os.bean.BaiduMapGeoBean; import com.xxpatx.os.bean.BaseResponse; @@ -45,11 +47,11 @@ import com.xxpatx.os.disklrucache.CacheHelper; import com.xxpatx.os.gson.GsonUtils; import com.xxpatx.os.manager.ConnectManager; import com.xxpatx.os.manager.ConnectMode; -import com.xxpatx.os.manager.RemoteManager; import com.xxpatx.os.network.api.amap.GeocodingApi; import com.xxpatx.os.network.api.qweather.LookupApi; import com.xxpatx.os.network.api.uiui.ActivityListApi; import com.xxpatx.os.network.api.uiui.AddressIndexApi; +import com.xxpatx.os.network.api.uiui.AppUpdate; import com.xxpatx.os.network.api.uiui.AppUsageRecordApi; import com.xxpatx.os.network.api.uiui.ArticleCategorysListApi; import com.xxpatx.os.network.api.uiui.ArticleListApi; @@ -63,6 +65,7 @@ import com.xxpatx.os.network.api.uiui.GoodsTypeApi; import com.xxpatx.os.network.api.uiui.GoodsTypeListApi; import com.xxpatx.os.network.api.uiui.HealthCodeApi; import com.xxpatx.os.network.api.uiui.KnowledgeVideoListApi; +import com.xxpatx.os.network.api.uiui.SnIsActivationApi; import com.xxpatx.os.network.api.uiui.contact.MailListAddApi; import com.xxpatx.os.network.api.uiui.contact.MailListDeleteApi; import com.xxpatx.os.network.api.uiui.RegionListApi; @@ -94,6 +97,7 @@ import com.xxpatx.os.network.api.uiui.sn.SosRecordApi; import com.xxpatx.os.network.api.uiui.sn.UpdateAddressApi; import com.xxpatx.os.network.api.uiui.sn.UpdateAlarmClockApi; import com.xxpatx.os.network.interceptor.RepeatRequestInterceptor; +import com.xxpatx.os.utils.Utils; import java.io.File; import java.lang.reflect.Type; @@ -323,119 +327,119 @@ public class NetInterfaceManager { */ public Observable> getSnInfoControl() { return mRetrofit.create(SnInfoApi.class) - .getSninfo(RemoteManager.getInstance().getSerial()) + .getSninfo(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getFamilyAddressControl() { return mRetrofit.create(FamilyAddressApi.class) - .getFamilyAddress(RemoteManager.getInstance().getSerial()) + .getFamilyAddress(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getUserAvatarInfoControl() { return mRetrofit.create(UserInfoControl.class) - .getUserAvatarInfo(RemoteManager.getInstance().getSerial()) + .getUserAvatarInfo(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getRunningAppObservable(String json) { return mRetrofit.create(RunNewApp.class) - .sendRunningInfo(RemoteManager.getInstance().getSerial(), json) + .sendRunningInfo(Utils.getSerial(), json) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getsettingControl() { return mRetrofit.create(SettingApi.class) - .getSetting(RemoteManager.getInstance().getSerial()) + .getSetting(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getSOSRecordObservable(String longitude, String latitude, String address) { return mRetrofit.create(SosRecordApi.class) - .sendSosRecord(RemoteManager.getInstance().getSerial(), longitude, latitude, address) + .sendSosRecord(Utils.getSerial(), longitude, latitude, address) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getUpdateAlarmObservable(int id) { return mRetrofit.create(UpdateAlarmClockApi.class) - .updateAlarm(RemoteManager.getInstance().getSerial(), id) + .updateAlarm(Utils.getSerial(), id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getUpdateDesktopObservable(String jsonArray) { return mRetrofit.create(UpdateDesktopApi.class) - .updateLayout(RemoteManager.getInstance().getSerial(), jsonArray) + .updateLayout(Utils.getSerial(), jsonArray) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getDesktopLayoutObservable() { return mRetrofit.create(GetDesktopApi.class) - .getDesktopLayout(RemoteManager.getInstance().getSerial()) + .getDesktopLayout(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getGoodsListObservable() { return mRetrofit.create(GoodsListApi.class) - .getGoodsList(RemoteManager.getInstance().getSerial()) + .getGoodsList(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getGoodsListObservable(int type) { return mRetrofit.create(GoodsTypeListApi.class) - .getGoodsList(RemoteManager.getInstance().getSerial(), type) + .getGoodsList(Utils.getSerial(), type) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getCategorysObservable() { return mRetrofit.create(CategorysApi.class) - .getArticleCategorys(RemoteManager.getInstance().getSerial()) + .getArticleCategorys(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getArticleListObservable() { return mRetrofit.create(ArticleListApi.class) - .getArticleList(RemoteManager.getInstance().getSerial()) + .getArticleList(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getArticleListObservable(int id) { return mRetrofit.create(ArticleCategorysListApi.class) - .getArticleList(RemoteManager.getInstance().getSerial(), id) + .getArticleList(Utils.getSerial(), id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getContactListObservable() { return mRetrofit.create(GetMailList.class) - .getContact(RemoteManager.getInstance().getSerial()) + .getContact(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getAdminSnSettingObservable() { return mRetrofit.create(GetAdminSnSettingApi.class) - .getAdminSnSetting(RemoteManager.getInstance().getSerial()) + .getAdminSnSetting(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getUpdateAppIconObservable(String pkg, String label, int type) { return mRetrofit.create(UpdateAppIconApi.class) - .appIconUpdate(RemoteManager.getInstance().getSerial(), pkg, type, label) + .appIconUpdate(Utils.getSerial(), pkg, type, label) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -456,7 +460,7 @@ public class NetInterfaceManager { public Observable getMailListDeleteObservable(String id) { return mRetrofit.create(MailListDeleteApi.class) - .deleteMailList(RemoteManager.getInstance().getSerial(), id) + .deleteMailList(Utils.getSerial(), id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -476,7 +480,7 @@ public class NetInterfaceManager { public Observable>> getAlarmClockObservable() { return mRetrofit .create(AlarmClockApi.class) - .getAlarmClock(RemoteManager.getInstance().getSerial(), 0) + .getAlarmClock(Utils.getSerial(), 0) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -484,7 +488,7 @@ public class NetInterfaceManager { public Observable>> getAlarmClockObservable(int type) { return mRetrofit .create(AlarmClockApi.class) - .getAlarmClock(RemoteManager.getInstance().getSerial(), type) + .getAlarmClock(Utils.getSerial(), type) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -496,6 +500,13 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable> getAlarmClockAddObservable(Map params) { + return mRetrofit.create(AlarmClockAddApi.class) + .addAlarmClock(params) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public Observable getAlarmClockEditObservable(Map params, MultipartBody.Part body) { return mRetrofit.create(AlarmClockEditApi.class) .editAlarmClock(params, body) @@ -505,28 +516,28 @@ public class NetInterfaceManager { public Observable> getAlarmClockByIdObservable(int id) { return mRetrofit.create(AlarmClockQueryApi.class) - .getAlarmClockById(RemoteManager.getInstance().getSerial(), id) + .getAlarmClockById(Utils.getSerial(), id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable deleteAlarmClockObservable(int id) { return mRetrofit.create(AlarmClockDeleteApi.class) - .alarmClockDelete(RemoteManager.getInstance().getSerial(), id) + .alarmClockDelete(Utils.getSerial(), id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getLivenVideoListObservable() { return mRetrofit.create(LivenVideoListApi.class) - .getLivenVideoList(RemoteManager.getInstance().getSerial()) + .getLivenVideoList(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getKnowledgeVideoListObservable() { return mRetrofit.create(KnowledgeVideoListApi.class) - .getKnowledgeVideoList(RemoteManager.getInstance().getSerial()) + .getKnowledgeVideoList(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -540,7 +551,7 @@ public class NetInterfaceManager { public Observable> getServeObservable() { return mRetrofit.create(ServeApi.class) - .getServe(RemoteManager.getInstance().getSerial()) + .getServe(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -554,54 +565,68 @@ public class NetInterfaceManager { public Observable> getOrderPayObservable(String order_sn, String order_id) { return mRetrofit.create(OrderPayApi.class) - .orderPay(RemoteManager.getInstance().getSerial(), order_sn, order_id, BuildConfig.APPLICATION_ID) + .orderPay(Utils.getSerial(), order_sn, order_id, BuildConfig.APPLICATION_ID) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getOrderPayCheckObservable(String order_sn, String order_id) { return mRetrofit.create(OrderPayCheckApi.class) - .checkOrder(RemoteManager.getInstance().getSerial(), order_sn, order_id) + .checkOrder(Utils.getSerial(), order_sn, order_id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getAllOrderObservable() { return mRetrofit.create(AllOrderApi.class) - .getOrderIndex(RemoteManager.getInstance().getSerial()) + .getOrderIndex(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getOrderIndexObservable(int status) { return mRetrofit.create(OrderIndexApi.class) - .getOrderIndex(RemoteManager.getInstance().getSerial(), status) + .getOrderIndex(Utils.getSerial(), status) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable> getOrderExpressObservable(String order_sn, String order_id) { return mRetrofit.create(OrderExpressApi.class) - .getOrderExpress(RemoteManager.getInstance().getSerial(), order_sn, order_id) + .getOrderExpress(Utils.getSerial(), order_sn, order_id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getAddressIndexObservable() { return mRetrofit.create(AddressIndexApi.class) - .getAddressList(RemoteManager.getInstance().getSerial()) + .getAddressList(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable getUpdateAddressObservable(String address, double longitude, double latitude) { return mRetrofit.create(UpdateAddressApi.class) - .updateAddress(RemoteManager.getInstance().getSerial(), address, longitude, latitude) + .updateAddress(Utils.getSerial(), address, longitude, latitude) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } + public Observable> getSnIsActivationObservable() { + return mRetrofit.create(SnIsActivationApi.class) + .getSnIsActivation(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable> getUpdateObservable() { + return mRetrofit.create(AppUpdate.class) + .getAppUpdate(BuildConfig.APPLICATION_ID, "0", 1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public RegionListApi getRegionListApi() { return mRetrofit.create(RegionListApi.class); } @@ -616,7 +641,7 @@ public class NetInterfaceManager { public Observable> getUserIDObservable() { return mRetrofit.create(GetUserIDApi.class) - .getUserID(RemoteManager.getInstance().getSerial()) + .getUserID(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -683,7 +708,7 @@ public class NetInterfaceManager { public Observable>> getActivityListObservable() { return mRetrofit.create(ActivityListApi.class) - .getActivityList(RemoteManager.getInstance().getSerial(), 1, 1, getUserId()) + .getActivityList(Utils.getSerial(), 1, 1, getUserId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -793,7 +818,7 @@ public class NetInterfaceManager { public Observable>> getDemandListObservable() { return mRetrofit.create(DemandListApi.class) - .getDemandList(RemoteManager.getInstance().getSerial(), 1, 1, getUserId()) + .getDemandList(Utils.getSerial(), 1, 1, getUserId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -913,7 +938,7 @@ public class NetInterfaceManager { public Observable>> getHealthCodeObservable() { return mRetrofit.create(HealthCodeApi.class) - .getArticleDetails(RemoteManager.getInstance().getSerial()) + .getArticleDetails(Utils.getSerial()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } diff --git a/app/src/main/java/com/xxpatx/os/network/UrlAddress.java b/app/src/main/java/com/xxpatx/os/network/UrlAddress.java index 3c4f357..d729550 100644 --- a/app/src/main/java/com/xxpatx/os/network/UrlAddress.java +++ b/app/src/main/java/com/xxpatx/os/network/UrlAddress.java @@ -21,6 +21,8 @@ public class UrlAddress { * 新接口 * SN */ + /*获取设备是否激活*/ + public static final String GET_SN_IS_ACTIVATION = "sn/getSnIsActivation"; /*爱心提醒通知成功接口*/ public static final String UPDATE_ALARM_CLOCK = "updateAlarmClock"; /*上传截屏图片*/ @@ -33,7 +35,8 @@ public class UrlAddress { public static final String UPDATE_ADDRESS = "sn/update-address"; /*获取设备家庭地址*/ public static final String FAMILY_ADDRESS = "sn/family-address"; - + /*根据包名获取更新*/ + public final static String GET_NEWESTAPPUPDATE = "app/newestAppUpdate"; /*获取抢购列表*/ public static final String GET_GOODS_LIST = "getGoodsList"; diff --git a/app/src/main/java/com/xxpatx/os/network/api/uiui/AppUpdate.java b/app/src/main/java/com/xxpatx/os/network/api/uiui/AppUpdate.java new file mode 100644 index 0000000..330e47a --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/network/api/uiui/AppUpdate.java @@ -0,0 +1,18 @@ +package com.xxpatx.os.network.api.uiui; + +import com.xxpatx.os.bean.AppInfo; +import com.xxpatx.os.bean.BaseResponse; +import com.xxpatx.os.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface AppUpdate { + @GET(UrlAddress.GET_NEWESTAPPUPDATE) + Observable> getAppUpdate( + @Query("packageName") String packageName, + @Query("versionCode") String versionCode, + @Query("type") int type + ); +} diff --git a/app/src/main/java/com/xxpatx/os/network/api/uiui/SnIsActivationApi.java b/app/src/main/java/com/xxpatx/os/network/api/uiui/SnIsActivationApi.java new file mode 100644 index 0000000..747dd19 --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/network/api/uiui/SnIsActivationApi.java @@ -0,0 +1,16 @@ +package com.xxpatx.os.network.api.uiui; + +import com.xxpatx.os.bean.ActivationBean; +import com.xxpatx.os.bean.BaseResponse; +import com.xxpatx.os.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface SnIsActivationApi { + @GET(UrlAddress.GET_SN_IS_ACTIVATION) + Observable> getSnIsActivation( + @Query("sn") String sn + ); +} diff --git a/app/src/main/java/com/xxpatx/os/network/api/uiui/alarmclock/AlarmClockAddApi.java b/app/src/main/java/com/xxpatx/os/network/api/uiui/alarmclock/AlarmClockAddApi.java index 5b1eff8..23de0ea 100644 --- a/app/src/main/java/com/xxpatx/os/network/api/uiui/alarmclock/AlarmClockAddApi.java +++ b/app/src/main/java/com/xxpatx/os/network/api/uiui/alarmclock/AlarmClockAddApi.java @@ -20,4 +20,9 @@ public interface AlarmClockAddApi { @QueryMap Map params, @Part MultipartBody.Part body ); + + @POST(UrlAddress.ALARM_CLOCK_ADD) + Observable> addAlarmClock( + @QueryMap Map params + ); } diff --git a/app/src/main/java/com/xxpatx/os/service/NotificationService.java b/app/src/main/java/com/xxpatx/os/service/NotificationService.java index 1b29bf6..f67ca7d 100644 --- a/app/src/main/java/com/xxpatx/os/service/NotificationService.java +++ b/app/src/main/java/com/xxpatx/os/service/NotificationService.java @@ -24,7 +24,12 @@ public class NotificationService extends NotificationListenerService { StatusBarNotification[] statusBarNotifications = getActiveNotifications(); for (StatusBarNotification sbn : statusBarNotifications) { String pkg = sbn.getPackageName(); - Log.e(TAG, "onListenerUpdate: " + pkg); + if ("android".equals(pkg) + || "cn.etouch.ecalendar".equals(pkg) + ) { + continue; + } + Log.e(TAG, "onListenerUpdate: pkg = " + pkg); if (notificationMap.get(pkg) == null) { notificationMap.put(pkg, new ArrayList<>()); notificationMap.get(pkg).add(sbn); @@ -59,7 +64,7 @@ public class NotificationService extends NotificationListenerService { @Override public void onListenerConnected() { super.onListenerConnected(); - Log.e(TAG, "onListenerUpdate: " + getActiveNotifications().length); + Log.e(TAG, "onListenerConnected: length = " + getActiveNotifications().length); updateNotification(); for (NotificationListener listener : mListener) { listener.onListenerUpdate(); diff --git a/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java b/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java index ca65bdf..3bbacf5 100644 --- a/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java +++ b/app/src/main/java/com/xxpatx/os/service/WeAccessibilityService.java @@ -44,7 +44,7 @@ public class WeAccessibilityService extends AccessibilityService { public static final int TYPE_VOICE = 0; public static final int TYPE_VIDEO = 1; - private static final int WAIT_TIME = 500; + private static final int WAIT_TIME = 1000; private int mCallType = TYPE_VOICE; @@ -106,7 +106,6 @@ public class WeAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { - Log.e(TAG, "onAccessibilityEvent: "); Log.v(TAG, "onAccessibilityEvent: event = " + event.toString()); if (finished) { finished = false; @@ -156,7 +155,6 @@ public class WeAccessibilityService extends AccessibilityService { break; case CLICK_TAG: step(Property.TEXT, mTagName, Step.CLICK_NAME); - break; case CLICK_NAME://点击item step(Property.TEXT, mName, Step.CLICK_INFO); @@ -164,7 +162,6 @@ public class WeAccessibilityService extends AccessibilityService { case CLICK_INFO://进入个人信息页面 step(Property.TEXT, DIALER_TEXT, Step.CLICK_CALL); break; - case CLICK_CALL://打视频或者电话 if (mCallType == TYPE_VIDEO) { step(Property.TEXT, VIDEO_TEXT, Step.WAITING); diff --git a/app/src/main/java/com/xxpatx/os/service/main/MainSPresenter.java b/app/src/main/java/com/xxpatx/os/service/main/MainSPresenter.java index 53f85a3..486b890 100644 --- a/app/src/main/java/com/xxpatx/os/service/main/MainSPresenter.java +++ b/app/src/main/java/com/xxpatx/os/service/main/MainSPresenter.java @@ -1,6 +1,7 @@ package com.xxpatx.os.service.main; import android.content.Context; +import android.text.TextUtils; import android.util.Log; import com.tencent.mmkv.MMKV; @@ -11,8 +12,8 @@ import com.xxpatx.os.alarm.AlarmUtils; import com.xxpatx.os.bean.AlarmClockId; import com.xxpatx.os.bean.BaseResponse; import com.xxpatx.os.config.CommonConfig; -import com.xxpatx.os.manager.RemoteManager; import com.xxpatx.os.network.NetInterfaceManager; +import com.xxpatx.os.utils.Utils; import java.io.File; import java.util.ArrayList; @@ -80,75 +81,86 @@ public class MainSPresenter implements MainSContact.Presenter { addFinishStatu = 0; for (AlarmClockData alarmClockData : localAddAlarm) { Map params = new HashMap<>(); - params.put("sn", RemoteManager.getInstance().getSerial()); + params.put("sn", Utils.getSerial()); params.put("time", alarmClockData.getTime()); params.put("type", String.valueOf(alarmClockData.getType())); params.put("title", alarmClockData.getTitle()); params.put("remind_type", "0"); params.put("is_onoff", "1"); - File picFile = new File(alarmClockData.getFile()); - MediaType mediaType = MediaType.Companion.parse("image/png"); - RequestBody requestBody = RequestBody.Companion.create(picFile, mediaType); - MultipartBody.Part body = MultipartBody.Part.createFormData("file", picFile.getName(), requestBody); - - NetInterfaceManager.getInstance().getAlarmClockAddObservable(params, body) - .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) - .subscribe(new Observer>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("addAlarmClock", "onSubscribe: "); - } - - @Override - public void onNext(@NonNull BaseResponse alarmClockIdBaseResponse) { - Log.e("addAlarmClock", "onNext: " + alarmClockIdBaseResponse); - if (alarmClockIdBaseResponse.code == 200) { - alarmClockData.setIs_local(false); - AlarmUtils.getInstance().updateAlarmClock(alarmClockData, alarmClockIdBaseResponse.data.getId()); + if (TextUtils.isEmpty(alarmClockData.getFile())) { + NetInterfaceManager.getInstance().getAlarmClockAddObservable(params) + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("addAlarmClock", "onSubscribe: "); } - } - @Override - public void onError(@NonNull Throwable e) { - Log.e("addAlarmClock", "onError: " + e.getMessage()); - onComplete(); - } - - @Override - public void onComplete() { - addFinishStatu += 1; - Log.e("addAlarmClock", "onComplete: " + addFinishStatu); - if (addFinishStatu == localAddAlarm.size()) { - mView.addAlarmClockFinish(); + @Override + public void onNext(@NonNull BaseResponse alarmClockIdBaseResponse) { + Log.e("addAlarmClock", "onNext: " + alarmClockIdBaseResponse); + if (alarmClockIdBaseResponse.code == 200) { + alarmClockData.setIs_local(false); + AlarmUtils.getInstance().updateAlarmClock(alarmClockData, alarmClockIdBaseResponse.data.getId()); + } } - } - }); + + @Override + public void onError(@NonNull Throwable e) { + Log.e("addAlarmClock", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + addFinishStatu += 1; + Log.e("addAlarmClock", "onComplete: " + addFinishStatu); + if (addFinishStatu == localAddAlarm.size()) { + mView.addAlarmClockFinish(); + } + } + }); + } else { + File picFile = new File(alarmClockData.getFile()); + MediaType mediaType = MediaType.Companion.parse("image/png"); + RequestBody requestBody = RequestBody.Companion.create(picFile, mediaType); + MultipartBody.Part body = MultipartBody.Part.createFormData("file", picFile.getName(), requestBody); + + NetInterfaceManager.getInstance().getAlarmClockAddObservable(params, body) + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("addAlarmClock", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse alarmClockIdBaseResponse) { + Log.e("addAlarmClock", "onNext: " + alarmClockIdBaseResponse); + if (alarmClockIdBaseResponse.code == 200) { + alarmClockData.setIs_local(false); + AlarmUtils.getInstance().updateAlarmClock(alarmClockData, alarmClockIdBaseResponse.data.getId()); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("addAlarmClock", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + addFinishStatu += 1; + Log.e("addAlarmClock", "onComplete: " + addFinishStatu); + if (addFinishStatu == localAddAlarm.size()) { + mView.addAlarmClockFinish(); + } + } + }); + } } -// Observable.concat(getAddObservableList(localAddAlarm)) -// .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) -// .subscribe(new Observer>() { -// @Override -// public void onSubscribe(@NonNull Disposable d) { -// Log.e("addAlarmClock", "onSubscribe: "); -// } -// -// @Override -// public void onNext(@NonNull BaseResponse baseResponse) { -// Log.e("addAlarmClock", "onSubscribe: " + baseResponse); -// } -// -// @Override -// public void onError(@NonNull Throwable e) { -// Log.e("addAlarmClock", "onError: " + e.getMessage()); -// onComplete(); -// } -// -// @Override -// public void onComplete() { -// Log.e("addAlarmClock", "onSubscribe: "); -// } -// }); } } @@ -168,7 +180,7 @@ public class MainSPresenter implements MainSContact.Presenter { private Observable> getAddObservable(AlarmClockData alarmClockData) { Map params = new HashMap<>(); - params.put("sn", RemoteManager.getInstance().getSerial()); + params.put("sn", Utils.getSerial()); params.put("time", alarmClockData.getTime()); params.put("type", String.valueOf(alarmClockData.getType())); params.put("title", alarmClockData.getTitle()); diff --git a/app/src/main/java/com/xxpatx/os/service/main/MainService.java b/app/src/main/java/com/xxpatx/os/service/main/MainService.java index 39fc39f..c90a310 100644 --- a/app/src/main/java/com/xxpatx/os/service/main/MainService.java +++ b/app/src/main/java/com/xxpatx/os/service/main/MainService.java @@ -21,6 +21,8 @@ import com.arialyy.annotations.Download; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.task.DownloadTask; import com.blankj.utilcode.util.NetworkUtils; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.hjq.toast.Toaster; import com.shehuan.niv.NiceImageView; import com.tencent.mmkv.MMKV; @@ -31,19 +33,21 @@ import com.xxpatx.os.activity.noti.NoticeActivity; import com.xxpatx.os.alarm.AlarmClockData; import com.xxpatx.os.alarm.AlarmUtils; import com.xxpatx.os.base.rx.BaseRxService; +import com.xxpatx.os.bean.AppInfo; import com.xxpatx.os.bean.BaseResponse; import com.xxpatx.os.config.CommonConfig; -import com.xxpatx.os.manager.RemoteManager; import com.xxpatx.os.network.NetInterfaceManager; import com.xxpatx.os.receiver.SmsReceiver; import com.xxpatx.os.utils.ApkUtils; import com.xxpatx.os.utils.AppUsedTimeUtils; import com.xxpatx.os.utils.CmdUtil; import com.xxpatx.os.utils.ForegroundAppUtil; +import com.xxpatx.os.utils.Utils; import java.io.File; import java.io.FileNotFoundException; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.util.Calendar; import java.util.HashMap; import java.util.List; @@ -350,7 +354,7 @@ public class MainService extends BaseRxService private static Observable getSendFile(String path, MultipartBody.Part body) { return NetInterfaceManager.getInstance() .getScreenshotApi() - .sendScreenshot(RemoteManager.getInstance().getSerial(), body) + .sendScreenshot(Utils.getSerial(), body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -466,7 +470,7 @@ public class MainService extends BaseRxService // AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); if (!TextUtils.isEmpty(packagename)) { NetInterfaceManager.getInstance().getAppUsageRecordControl() - .sendappUsageRecord(RemoteManager.getInstance().getSerial(), + .sendappUsageRecord(Utils.getSerial(), ApkUtils.getAppNameByPackage(context, packagename), packagename, AppUsedTimeUtils.getInstance().getStartTime() / 1000, @@ -595,8 +599,8 @@ public class MainService extends BaseRxService mBallParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mBallParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // mBallParams.gravity = Gravity.TOP; - int x = mMMKV.decodeInt(Float_Window_X, 0); - int y = mMMKV.decodeInt(Float_Window_Y, 0); + int x = mMMKV.decodeInt(Float_Window_X, 360); + int y = mMMKV.decodeInt(Float_Window_Y, -783); mBallParams.x = x; mBallParams.y = y; mWindowManager.addView(mBallView, mBallParams); @@ -608,6 +612,7 @@ public class MainService extends BaseRxService for (String pkg : pkgList) { if (pkg.equalsIgnoreCase(BuildConfig.APPLICATION_ID) || "com.xxpatx.sn".equals(pkg) + || "com.tencent.mm".equals(pkg) ) { continue; } @@ -681,7 +686,8 @@ public class MainService extends BaseRxService lastY = nowY; break; case MotionEvent.ACTION_UP: - + Log.e(TAG, "onTouch: x = " + mBallParams.x); + Log.e(TAG, "onTouch: y = " + mBallParams.y); break; default: } @@ -703,10 +709,34 @@ public class MainService extends BaseRxService void taskComplete(DownloadTask task) { // 在这里处理任务完成的状态 Log.e(TAG, "taskComplete: " + task.getFilePath()); + String jsonString = task.getExtendField(); + Log.e(TAG, "taskComplete: " + "下载完成:" + jsonString); + AppInfo ariaDownloadInfo = getAriaDownloadInfo(jsonString); + if (ariaDownloadInfo != null) { + ApkUtils.installApp(MainService.this, task.getFilePath()); + Toaster.show("下载完成: " + "\t" + ariaDownloadInfo.getApp_name()); + } } @Download.onTaskFail void taskFail(DownloadTask task, Exception e) { } + + private AppInfo getAriaDownloadInfo(String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + Gson gson = new Gson(); + Type type = new TypeToken() { + }.getType(); + AppInfo ariaDownloadInfo = null; + try { + ariaDownloadInfo = gson.fromJson(jsonString, type); + } catch (Exception e) { + Log.e(TAG, "getAriaDownloadInfo: " + e.getMessage()); + } + return ariaDownloadInfo; + } else { + return null; + } + } } diff --git a/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java b/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java index 09265f8..67ea71b 100644 --- a/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java +++ b/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java @@ -19,19 +19,27 @@ import android.util.Log; import androidx.annotation.RequiresApi; +import com.arialyy.aria.core.Aria; import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; import com.xxpatx.os.BuildConfig; import com.xxpatx.os.activity.quickapp.QuickAppActivity; +import com.xxpatx.os.bean.AppInfo; import com.xxpatx.os.bean.DesktopIcon; import com.xxpatx.os.config.CommonConfig; +import com.xxpatx.os.gson.GsonUtils; import com.xxpatx.os.manager.AppManager; import com.xxpatx.os.manager.AppStatusManager; import com.xxpatx.os.receiver.InstallResultReceiver; import com.xxpatx.os.shortcut.ShortcutPkgInfo; import com.xxpatx.os.shortcut.ShortcutUtils; +import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.Collator; @@ -663,6 +671,141 @@ public class ApkUtils { } } + /** + * 通过路径安装APK,兼容Android 9以上 + * + * @param context 上下文 + * @param filePath apk文件路径 + */ + public static void installApp(Context context, String filePath) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + installAppatPie(context, filePath); + } else { + installApps(filePath); + } + } + + + public static boolean installApps(String apkPath) { + Toaster.show("正在安装应用"); + Process process = null; + BufferedReader successResult = null; + BufferedReader errorResult = null; + StringBuilder successMsg = new StringBuilder(); + StringBuilder errorMsg = new StringBuilder(); + try { + process = new ProcessBuilder("pm", "install", "-i", BuildConfig.APPLICATION_ID, "--user", "0", apkPath).start(); + successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); + errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); + String s; + while ((s = successResult.readLine()) != null) { + successMsg.append(s); + } + while ((s = errorResult.readLine()) != null) { + errorMsg.append(s); + } + } catch (Exception e) { + Log.e("installApps1", e.getMessage()); + } finally { + try { + if (successResult != null) { + successResult.close(); + } + if (errorResult != null) { + errorResult.close(); + } + } catch (Exception e) { + Log.e("installApps2", e.getMessage()); + } + if (process != null) { + process.destroy(); + } + } + Log.e("result", "" + errorMsg.toString()); + //如果含有“success”认为安装成功 + Log.e("installApp", successMsg.toString()); +// if (!successMsg.toString().equalsIgnoreCase("success")) { +// install(context, new File(apkPath)); +// } + return successMsg.toString().equalsIgnoreCase("success"); + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public static void installAppatPie(Context context, String apkFilePath) { + File file = new File(apkFilePath); + PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller(); + PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller + .SessionParams.MODE_FULL_INSTALL); + sessionParams.setSize(file.length()); + int sessionId = createSession(packageInstaller, sessionParams); + if (sessionId != -1) { + boolean copySuccess = copyApkFile(packageInstaller, sessionId, apkFilePath); + if (copySuccess) { + install(packageInstaller, sessionId, context); + } + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private static boolean copyApkFile(PackageInstaller pi, int sessionId, String apkFilePath) { + boolean success = false; + File apkFile = new File(apkFilePath); + PackageInstaller.Session session = null; + try { + session = pi.openSession(sessionId); + OutputStream out = session.openWrite("app.apk", 0, apkFile.length()); + FileInputStream input = new FileInputStream(apkFile); + int read = 0; + byte[] buffer = new byte[65536]; +// while (read != -1) { +// read = input.read(buffer); +// out.write(buffer, 0, read); +// } + while (true) { + read = input.read(buffer); + if (read == -1) { + session.fsync(out); + success = true; + out.close(); + input.close(); + break; + } + out.write(buffer, 0, read); + } + } catch (IOException e) { + e.printStackTrace(); + Log.e("fht", "copyApkFile" + e.getMessage()); + } + return success; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private static void install(PackageInstaller packageInstaller, int sessionId, Context context) { + try { + PackageInstaller.Session session = packageInstaller.openSession(sessionId); + Intent intent = new Intent(context, InstallResultReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast( + context, + 1, intent, + PendingIntent.FLAG_UPDATE_CURRENT + ); + session.commit(pendingIntent.getIntentSender()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private static int createSession(PackageInstaller packageInstaller, PackageInstaller.SessionParams sessionParams) { + int sessionId = -1; + try { + sessionId = packageInstaller.createSession(sessionParams); + } catch (IOException e) { + e.printStackTrace(); + } + return sessionId; + } + /** * 静默卸载应用 * @@ -764,4 +907,65 @@ public class ApkUtils { return uid / PER_USER_RANGE; } + public static boolean checkAppUpdate(Context context, AppInfo appUpdateInfo) { + String packageName = appUpdateInfo.getApp_package(); + long versionCode = appUpdateInfo.getApp_version_code(); + return checkAppUpdate(context, packageName, versionCode); + } + + public static boolean checkAppUpdate(Context context, String packageName, long versionCode) { + PackageInfo packageInfo = null; + try { + packageInfo = context.getPackageManager().getPackageInfo(packageName, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo == null) { + return true; + } else { + long appVersionCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + appVersionCode = packageInfo.getLongVersionCode(); + } else { + appVersionCode = packageInfo.versionCode; + } + if (appVersionCode < versionCode) { + return true; + } else { + Log.e(TAG, "checkUpdate: " + packageName + "\t已经是最新版"); + return false; + } + } + } + + + public static void ariaDownload(Context context, String url, AppInfo ariaDownloadInfo) { + Log.e(TAG, "ariaDownload: " + ariaDownloadInfo); + String fileName = Utils.getFileNamefromURL(url); + String app_md5 = ariaDownloadInfo.getApp_md5(); + Log.e("ariaDownload", "app_md5 = " + app_md5); + File file = new File(Utils.getDownLoadPath(context) + fileName); + if (file.exists() && !file.isDirectory()) { + String fileMd5 = com.blankj.utilcode.util.FileUtils.getFileMD5ToString(file); + Log.e("ariaDownload", "fileMD5 = " + fileMd5); + if (fileMd5.equalsIgnoreCase(app_md5)) { + installApp(context, file.getAbsolutePath()); + } else { + file.delete(); + Aria.download(context) + .load(url) //读取下载地址 + .setFilePath(Utils.getDownLoadPath(context) + fileName) + .ignoreFilePathOccupy() + .setExtendField(GsonUtils.toJSONString(ariaDownloadInfo)) + .create(); //启动下载} + } + } else { + Aria.download(context) + .load(url) //读取下载地址 + .setFilePath(Utils.getDownLoadPath(context) + fileName) + .ignoreFilePathOccupy() + .setExtendField(GsonUtils.toJSONString(ariaDownloadInfo)) + .create(); //启动下载} + } + } } diff --git a/app/src/main/java/com/xxpatx/os/utils/JGYUtils.java b/app/src/main/java/com/xxpatx/os/utils/JGYUtils.java deleted file mode 100644 index 5e3a959..0000000 --- a/app/src/main/java/com/xxpatx/os/utils/JGYUtils.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.xxpatx.os.utils; - -import android.annotation.SuppressLint; -import android.content.ContentResolver; -import android.content.Context; -import android.os.PowerManager; - - -public class JGYUtils { - private static final String TAG = "JGYUtils"; - - @SuppressLint("StaticFieldLeak") - private static JGYUtils sInstance; - private Context mContext; - private ContentResolver resolver; - - private JGYUtils(Context context) { - if (context == null) { - throw new RuntimeException("Context is NULL"); - } - this.mContext = context; - this.resolver = mContext.getContentResolver(); - } - - public static void init(Context context) { - if (sInstance == null) { - sInstance = new JGYUtils(context); - } - } - - public static JGYUtils getInstance() { - if (sInstance == null) { - throw new IllegalStateException("You must be init JGYUtils first"); - } - return sInstance; - } - - public boolean isScreenOn() { - PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); - //true为打开,false为关闭 - return powerManager.isInteractive(); - } -} diff --git a/app/src/main/java/com/xxpatx/os/utils/WiFiUtils.java b/app/src/main/java/com/xxpatx/os/utils/WiFiUtils.java index bfab2ab..aee2118 100644 --- a/app/src/main/java/com/xxpatx/os/utils/WiFiUtils.java +++ b/app/src/main/java/com/xxpatx/os/utils/WiFiUtils.java @@ -221,5 +221,21 @@ public class WiFiUtils { return mWifi.getState() == NetworkInfo.State.CONNECTED; } - + /** + * 判断网络连接状态 + * + * @return true:网络已链接, false:网络已断开连接 + */ + public boolean isNetworkConnected() { + if (mContext != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) mContext + .getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo mNetworkInfo = mConnectivityManager + .getActiveNetworkInfo(); + if (mNetworkInfo != null) { + return mNetworkInfo.isAvailable(); + } + } + return false; + } } diff --git a/app/src/main/java/com/xxpatx/os/view/ToggleButton.java b/app/src/main/java/com/xxpatx/os/view/ToggleButton.java index 9387841..80765f4 100644 --- a/app/src/main/java/com/xxpatx/os/view/ToggleButton.java +++ b/app/src/main/java/com/xxpatx/os/view/ToggleButton.java @@ -8,6 +8,7 @@ import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; +import android.util.Log; import android.util.TypedValue; import android.view.View; @@ -19,6 +20,7 @@ import com.facebook.rebound.SpringUtil; import com.xxpatx.os.R; public class ToggleButton extends View { + private static final String TAG = "ToggleButton"; private SpringSystem springSystem; private Spring spring; /** @@ -28,11 +30,11 @@ public class ToggleButton extends View { /** * 开启颜色 */ - private int onColor = Color.parseColor("#f62626"); + private int onColor = Color.parseColor("#32CD32"); /** * 关闭颜色 */ - private int offBorderColor = Color.parseColor("#e7e4e4"); + private int offBorderColor = Color.parseColor("#f62626"); /** * 灰色带颜色 */ @@ -168,6 +170,7 @@ public class ToggleButton extends View { public void toggle(boolean animate) { toggleOn = !toggleOn; + Log.e(TAG, "toggle: toggleOn = " + toggleOn); takeEffect(animate); if (listener != null) { listener.onToggle(toggleOn); @@ -216,6 +219,7 @@ public class ToggleButton extends View { } public int isToggleOn() { + Log.e(TAG, "isToggleOn: " + toggleOn); return toggleOn ? 1 : 0; } diff --git a/app/src/main/res/drawable-hdpi/add_contact_back.png b/app/src/main/res/drawable-hdpi/add_contact_back.png index 764ca069062e6feed590ebcf26c3520f28d43525..037718a4982a792c09a4721861e79d3e653add91 100644 GIT binary patch delta 600 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 diff --git a/app/src/main/res/drawable-hdpi/default_avatar.png b/app/src/main/res/drawable-hdpi/default_avatar.png index ccc71a632b901c19f3e96082095bd2e24c174e31..cf4cb6a2f82f8ccfdbb9cc11d798acbcbd4078f7 100644 GIT binary patch literal 8557 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 bKqSCF2Efd3Cys~I00000NkvXXu0mjfJ5w#U literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_call_missed.png b/app/src/main/res/drawable-hdpi/icon_call_missed.png new file mode 100644 index 0000000000000000000000000000000000000000..03305eb416d47762ae2509f46d99ea505d7d525c GIT binary patch literal 1218 zcmV;z1U>tSP)Px(d`Uz>RCr$PoNZd-Fc8O+uG|ApBA$c#h#z#lg?bBDKfpegbI6`V?jbZwtkHrk znaRxb1>#pT$>f)RCX;E4R`HKSK$EPav5EkRB8UJZKq3L6c~oEoNF+csj|z+ci3Et| zQGsm&oJ?+qcKp>!4YTZVLG*=WesOU<$#Z?DlwQo|f38A0OVgWsW7MVA>Ti}k-9!2a zR-heBDRt)tF-9#h14Ep{v>A_Y-n3R93u=9t&!0{)_Gx&krRg4Dcf#>GgI7AyxR;%^YsR*j1pYt(`EPFopEtva13Lp?(Zy-|P z*@=Py?#4Xe3UyYA9Pq#Z)AV+vRQ?Ktw%e?85V_zX0DhlPeTS&ES(f9ZQn;A6JAdyM z9*=)dH-kiTmcicMA&v zwEi@J6=Zuch;^w-=#8arULFOC z0~FcLzC4c;V(S2lDo%36RSxsPb4ucZ*gC+^NQAn;*KH>#JWhz60LXC~{!I8`d0v$g zF}IUW0K_<4r@rlk9|o^ZiI@d#GmZITVGO*0SqIRS^h2xSg%b0LE$JtTd3bqwoVSL4KLmImcba{({EQ24kd?r< zNzS=)Km6Ey7T$WG#C@3K(BMNr>j?l*VjCZZ`n+4%HjvrIM+DG96i8>psxY(-iMRG{ zVF?xXJ@+eP1_87N{D;Y5Y-2D$?(+Vjs1OWLLWNqJE9jjQADx=9Kmz1VX{-tdgXDZR zdt5d%UH(x}03}q|_pOWuD3KTT`DTI!D3ll4ZhM&<1_87xe1Feh-7B?xkp)*tE{|Kh zerL`$Y98A6qz422&_rwv0$9XC-UG$Kz#c4hi`mpW+ra<}h}$okb14xzd0;#i4GkoK z)lamzFcxpy*FB#A!gJ1uK_mf`xF=WPw;*j?OOpJbF~62d<@Vi{uTLz1OC|!54A45y zea!;`32DX-kp-Y+JPe`av0;VC2Jl!RvI3MoRG8JsqC{4J--pWf7emYw=j@IQksY9e zD05TcWcSq<38DzVV}d9K@K_*<0{n((?wCH-5!u6~PSM+09AN3TV!w96-X5fZRrHU0 z*wqL?=cQEffs-<}Lf$CA{v_LQ6*dmA4~NUiNpcD;#v1v5p1@qd4LRdXxi4GU zHYT6)KOPA77ic8d{sc-HSu0c;Os7`)B`bRdgLx4PW^jf3FW zR%eKcdApr-Qh~cpx{qKuZ!%n83G@PBd26rN>k&nj&_||Fo%af0c~XTc)llp8Fwc{- z&G&Yrx>U$PQz}_-e_GL7fOQISKgnnR54}x5)mGK+-~du!gxE%aA=FAX5nu#JBtSHe g3XA}W1c>JU0V%;6e(8t-KmY&$07*qoM6N<$f+uhn+a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_call_outgoing.png b/app/src/main/res/drawable-hdpi/icon_call_outgoing.png new file mode 100644 index 0000000000000000000000000000000000000000..c1392c1ae5a2651b48d2aee47f8b5342b6d205e2 GIT binary patch literal 1181 zcmV;O1Y-M%P)Px(S4l)cRCr$PoL^eoFbu%$ti4A$32=^P-^v4wTQF|H;Gx||dJejiz&&W=p(Tb; zl32E+{AtZ=EnEIsl4aRJtN2GEph?nESVe$DBZvSaKq3L6c(lL>kVt?i9xX5eBoZKs zM+@u|;9_w-gYmapHOsQQ4N(_1@ie_YGbUeZt^Vuh^Jk2D(OUhO@ z#tz~;Fh;r1HuL$c^I-?LAM;$wmB06H ziA{RCjDZy(F{TU-;#YWP13RxVdMOeEU8{w##=$_WgO_Cw=ik3yE<^xQQ-TWI-XS)@ z104kcUOk5-q(e(_+Te)+++P)ht74jTZiy~#XPI@(CX-~fTHU>j2B1& zVQ3)Z#zzDYAPS^2VpW(>R}7VNy0C;5jy?CQ!bSlE0shV8Fx(goko$h*P^=IQP{Ine zHW!bN53A7lGXyzLfV?RUSmAVZ# zaqBzvc4u*bmD37*0PTBv=#ZTq%I~tP6M$AVsp11CW#0;UrvS&3Y~!u4bAV&mTqcv` z1Y3;l1>n%*BKBizm`85_KjLEezbN61eU-kvcH-Uv4$B(-?_>r6(5`;J#Rz|RgK*(G zH|!o{7`(v(v`~vmxB4M<=TeU274!BNd{8djv?-JqNUSFru1_pR0k9e);lB}4tP*== zirwKy1+Y4)!Yb8F>)kBRlhe0PRL`1TN?2%0B^&NfD@F^j&E4&9*wX~o+UnXJ96$<; v5ZMSYgjz)=0*nBO1c>6%0wX{o0iyUn@5ae*ca5xp00000NkvXXu0mjfijoW% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_delete_contact.png b/app/src/main/res/drawable-hdpi/icon_delete_contact.png index 22f152830ed2fda472f3a5d922c66d9169cbfe1b..dd3cd616d9c443d03641c71cb8908fae537d0a2d 100644 GIT binary patch literal 903 zcmV;219<$2P)Px&K}keGRCr$PoZ(r-APk1NO>`1<6P-kzL^n|} z3tIz3*a9t-Morn!LO3dEG(87vZbG{GUH~CGch+_X2y=khZRI(un^}bgqZ2xcEmI9F znL>s87=DSP06hg*I`oI%eWeW?IHeR|>CCDmfB0n%&eRm37Pk$*`wAO42*0E=5U*an z-&-r}tIHBc@7Gco6C-=%>*gaD&((OF=(2l32qKM~vZO)&yA+Twi32x@vl^3i$EgJ9 zd{ZJo0(2QUP1uF+`#&02vV$f}fG!=R2DZkO18ToD1*_BtRzt=X7cy0Xhjd zrw^xr$iKx}KFi+mnl-Qgv&>l{V;F#G<$$H!VqTPl(hQ{1OEoTljlW}Kg49xxFbu%7 zLJL3uF*l@t2encV35Hf!Gz>r~n_Ws|NE_2C3?vzApvQ-5O0<|RnpX6r^a;>edqRK& zC?D4};Xx9rG+~-BO;{qpIB-UVao`LF1L?$G=tSs5=tSs5l<(f?MCe5F`8_%jIuSY% zIuSaNLmgmBf8wG2SAomuMCe55MCe55MCe4sbAV37Qn5oPvaJ(ITR&-SnWT)gRxBj7 zmpYl+n6y|(gMkXG^t)vZMk+&lNKmO^{#3%vqWlcsAdBDK3I>9bxLE6lYA#FrrYOVO zM{p>B#-q0DWd!KNO@IXGB;cG*4J1G(0q68Tp@CY#xO0z9r*{RI>xF6wSesICES{_T zHt%Ukg=(pp?1;^Ga=jApJS+*4ujjS|;D74urhOjqqx4GvO7Eu*>-n=&&E~sQ195%t zj^tZVwtR-RN(1AhQ#NHSOLX)=mzeN;GBgn(z^Sy!TittqEkMAWx5?9*VQ*oIn#>qE dSkr6bdY>z`oM2q_xz+#x002ovPDHLkV1n;7oQ41Z literal 1926 zcmV;12YL93P)Px+KuJVFRCr$PoxgMBG!)05ysRhC&_KB!r(m)RS3+}FTvBo^G%(Cu@=tJOk}m(n zg@S<@s2QlTSKO8S7>eCgaUAHNVYr*%O)SvHdt`E1Nw!v&Y=3tqlftsB_ufZeJxTt- z2)|ByfOXn>7*7D8;}8G<0MKy{bliL>008K?2Rd#(6aWDD>w!tU7E_*YGtTc5V=)nl zKi_}Jyn&o2oUtbq1mjV1KK8ZIUMj%Lz!UBI>bNrPVnl~|5bTeV^D8(!`gsSyBwpKO zd4A-Pk5<)`gcE%+O0&IHRk(_JyaHe{=x;N|9co1y)kP~vhdWz^A0L{cN;hgXLGH%Lx?R*ML6tg@R$*gqU!iR*=IRF~+pA6G%-L+Jfy}kgU zn9eSTfb;S2Y_?Ul?p2m|4!|@DPh>sCr;NF*<27bB&f)d}0BQEmgJ9i)h4%5szq*a2yILCMUoIBTd2blz4oa?)N0KhcDit_O554=G0hswWr|;BO2@8aH>>*_V@*s+~xrQ z&~YvR008K?2Rd#(6aWBp+yfmq9|`~fI_`mvn_r6pT)Uq@EGfst`B-i!LH~VX z>=7q=z=*^>c;DrWAG~`y`%&k7Rhi>K|AU;dM?~}?BbpJ>4?V^Y-Z`E9q&ipkc(Loc zdF|aohdTTDy7ezBXB`09Qt~RE`YD3{jEMR-j6A<&{O)^(L7E4j*fYlHwHx)nxCr>Y zJIU;4lORZ*A=FyRHMzDp*E#^w`w2Amt5pV0qwpId`uNsWE=FH(oMxY>>X03uM&Y+a z^wDi)IH#{hXW6GF^-rR3??2VL^<`LfJUwh30NeM(O``BQBYI;=5dIpb*_$Q-nnvLZ zB6@vE9e)nf>@CCko!&OyXaG1-a2$n~vH+;|!)51kqTX>7Uf8N%)N8wgsNe(u5)T0Y z6+RlrZ4wRz&E@!iY=rjZXm<<5{Kt-8N!Zn5f zC;)~43;{9*Fa%%-P>HzNaSQ=+|Jn49PUN5fPyiiHs+X}zIFi8Xaao)R1%LvWQzWYa z3VwIYk%(s{7F95UJBDC;${dhm-1MY!Z$fpn6;|4b<=*wu3dC zq$&ahz%&rkKnVjjJBX@tisMKEkp${+QoW2#!jS}4j|-AO4c{RN)Nqoj2owNGAd)~N zfy+H$_~ef2$spVms*q^R0x%0ujpAmz` z5{{L?>T$tJpoZ_T5~$%MRS_rvW&xN5U>1N`0A>M8Jb%MUkeAIUWK4K*#R~003P8Ym2uy)J$guXC5ZE}n?K9H!Z4I*!IdkcEYyIRIB*3wcUJ;f+f? zzqsW0?)*Oc#Uwz**Fv7MS3gMcH_z$r=(p@wllq|mX=bcK1q7cH(E}2eY91Jkd0 zECRduB#roFjHsV6`kn%QuyJArSD|3mrpY>B8arQg5!ZyP+UNSXYySWM#{>X?6$}B6 zV`y}F0001x0~mFohMx=tfC4}P8s3SGnhynl0zd(bx=_PUh5|qVpa2c;#751B0zd&; zuK*`R6ff&0tN4VxQ5ST0a`EYS;h&{HlUv$!OsiurKn?)sJEODNp-yAlR%SBjZ!^Xo zOYBO9X|`_DZu*J)&bC=+D4fEH_D5;9*K7ddwV37kk;+(`MmDu>+vC6Ri**GM7nwxi9wQRO z}{cJpeev*$0oQ#$~22;#Lk$n#xJB-RI(t`ascgwq1)2AOKL#U#%+*09qH)as~l_a{g*vX#mi=kd`y(UmvXp+h?Ux1ONa4 M07*qoM6N<$f^{Zm?f?J) diff --git a/app/src/main/res/drawable-hdpi/icon_edit_contact.png b/app/src/main/res/drawable-hdpi/icon_edit_contact.png index 13c3c7661731e3e62b4005985097265e99535390..556ac1ef4a5c9d3578ac402b5b47c19f7d3cbd54 100644 GIT binary patch literal 1050 zcmV+#1m*jQP)Px&)Ja4^RCr$Po$FN`F${%GB?*-zRFY5$NhN_wAeDqp!rnbA&agAG<(Dkk_z&b{ zJY#<&OV^JPH$h&$h7f*+5WZcie3w^Mx$-rH@Df7!eQGCuS1C7wrvTKS5CQ;tD1djX z)zBC~00TH{mL_3ycdds>;-=9XzV`US_WqmnW^b_|&jsU{X!SXzp zS_?cfAo$i_*HEqjdbd3E50(cDEG@9Se@x|_f87F%RovbWH-Sl`s6{&=4MgFZHh}?L zS1e$Dusy2@hFq3nu(NOinDTpgvmifnk-$U$KLjWO7^}PjJOqaa zfpxGx@IO;|1$a4ua~IuVfwAFRD+dHGb?7Bk@X&GqgysXpqavB=4JA23m`4#lYKFi-Mtw+@_{P> zES4+WyIRQtt0OKKWmmAkF7Q?v!cFAL%0pNhG>TNm>^@KmFDX}6w7~B0X7+*2<;qGH z*e&9&AY)YF%{GL)%9V@t(N-rGR?k}-Geu!(&?u5C2g`ndcsC0`DZEm-!nuZ*836W% zhmp#y+P``Ss3lj}Z4b`?H6!kH05##ohOo;hoFi9St*TFDfzqH+Dp!ss9Mb@l!Yh?4 z+?00;fTQ3|;RChg%9IwU9dW1fffnGo9l|5z%2Y#G8ZhOh^CW{0pvx#DIB zr#>yCj-2;i73GQxfYu|fX&;yqaV>o%WkN_xzQv`t-*P`AXU1WA2z!aRCWo+Rc*A8( z&H{m2zL(5#J=6zs-=SPDO<@xp>w6Z%VF2;qAD4tal<{bne=5~_1OHzH(3_R?RdXif!sgV( z`H(s1r!@Cnb33GcJ)7AC0Ao`v4;rmE%-Ce$9spwtoLWaGdPAtWe{3P-764Q0bSnpw zWKuRs`a93^qsH=5)6lbfBY-I@L_;V?v(*)o8d%%9lC;n7u5FuKOuBMH39tXQYO#U) zQ0_2E4nZ{cJ-A+HXOk{|8tC(|Ca^hFsYRa<`FFGX@`=k2_z7_j@lX@T5-dub>9BF6 z_+a>acDo^!p^|b0U`55tA0ueRR+RQR1&|s;@aWHB;NLR=rK7_533Y+RUeWR4H>GE0 U`1*F7MF0Q*07*qoM6N<$f?-kHxc~qF literal 1849 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 diff --git a/app/src/main/res/drawable-hdpi/icon_location_refresh.png b/app/src/main/res/drawable-hdpi/icon_location_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..5d92dab8f6cbc64de4d80e1220adb46ba8d22e22 GIT binary patch literal 1093 zcmV-L1iJf)P)Px&|4BqaRA@u(TZ?hqFbowZX){TiNm5VJW|BISG?}E?g!NMhA4L2|I$PAs{kjUzc1SOz5&o$m(cua4R9CWjWw!~ z-SdSH&LITi0L?RV8#CY-BeeNPJ;F!BoSZ;R^c#o_7YNL1CFm1o4$e?tCcuf1H0yMp z42Z{Ke#vqOyk;B#eYSvB1CB95tCAJ~6cbp@tl6@8D%@FhZHEvZYB$hNZu%l%B{8ig z6V4{n_z*OJw*(IVy#Spo@+tpa16b0m$)wbat!Stu${BRA^cI3>0v618Gp)9S;vh}% z$RqX10u~5r(TP`U-sh6GVR?C|%5^6L7Nj^7ETKxE!Q>RHuLAs+k=~xb0;tAywKd!@ z37jzfbqZN{owCaEx zL^a%$xdjy9y;&XtpHd^QQ&O zaML>n`0xz{+7CH{A5O>Hx2>$(?gEV8-rmt5Ss-<&D?Sb=+!XEVEE36 zP;_&%RaF9(3RrdnlqS-uL#btb9>BZV;1h~&s)v9cz!a1Wb5V-gF?OkW0S}AB6o=u> zI+PMH?NL*$Bv@D~55605DQZ2%qMMqAQH6fZmK5eg+U`-BI zsEO(tcPF6Oh?9z1Ma_~RRe;ghSTaQKESSpn(-;^|TZ4tRrX{5YocX;q1>*F!3W~(Z zJgG=r(qd`tuAJQr*r9DH4EEf2#{w?EnYQySUeCm>&$zUj53&ky0bEn)X$9Eb-**9A z0LNOyx|FJ1CGdy=_W7a~<2#9zNC5eF(p>&1UJAiwdND+jT6zB;DlI)y62-$W00000 LNkvXXu0mjfE-wPK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_menu.png b/app/src/main/res/drawable-hdpi/icon_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab043574b72de9c31fa8901bc9f832f7409d316 GIT binary patch literal 689 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-HD>V9NG%aSW-5 zdpqY~;bH@c){779%w8U`tJ2Bp2=<)h_2>$Noc!YuA+C)}V+|V=x0SQ>3;(qE@84rL zPhdg2&ml!YgGo|_Ob!=W7+4l~I81r$z|h6wV#zm0>cPW;3X8dZ{7JhvPf3p~`*U;S zwMND}KWpmzC#6`PzUO~^rIGLDt5tjToF|JOkh=H17(Q@;K<@S}>GeE+@nyWNfn%99u__IU)9 zpVIoib+SirNPEw`8NK<*zn||~U-165TW#gk%X3bwk5jT|U{BC}ImVDRjg!_H< zU-x^yeBf?eWZrVnu#e&Wp~pM6Y60DeUub!Pz6AcLo?pUXO@geCwG CF(i5b literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_missed.png b/app/src/main/res/drawable-hdpi/icon_missed.png deleted file mode 100644 index 1016ce462e91bea02fd49f39f8335ed71b6dd0b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1795 zcmV+e2mJVnP)Px*y-7qtRCr$PoPVekRTRh1ncXGHURnMlmALDhvzw_{qk_n&*L!nE-b2F_Lc*uG^>9wy*DNfr-JLsg z@10p6bN}6QzW1EZoI5l3$1FnLv1K+Ph^0p02M5en>>O$LT`|@c{tb z7Wy0_q6<{~69E)LtObB}SLnJdAPON~0)Pjbl2(Q|4jv%lo388LZ3SQiyhfi{L2Rxf z8A~L@@$gi9n!(1ZK+p3&M#Lp5R|WvO9-=Nh$w3*Q5aKlexK|P0m{|}6H`Hpiuj2Ta zuvG!0Vxtm^5$;!CcGPs}1jrOTr3w^6Tnqra0ANbeoPr=&QmfUr zCG}70*9ugq)p*(}-6uQsA6bFE?{8)1#YvNB^6Miad6Q4IwSd^%f8;|ZD%g$yg%D>0 zz##yb93`aq`<+DewxX>uvo;X5;YAK%A;dxe*kLS_|Adwi(H6s+9py3u=y~2#i1>ts zWS0}s%NBJ1Czkp$V}27F2~0KLWs|I*BRzYR?M7b;|p@YDwSoyw?#? zX=PRsR7*1=iky?{=-c#-x(7Z405)HCkM;EQoIh>av=cUyw5c5h(8gT2k^=BrHx76ie1)qPi! z{o2rq1So`94FDSrcb>_Hli?i3O=yR!3iPW z2Y^0}I*xO5Z*T7> zru4GXQ35D~^L>8}Ge2!G(CtKYi$T3iq?7^f-@pHyAPDvXz(uAaod{K^3^06{$a8lu zngR#_`%0zKqH?+Xhe6F$rD6dLA?^l%D-A}ui-@i=sF$i#Y=EBUEk(q4Oh$=_J6zXY zWKuINt=Is=D*O}xj3#`#PVW){92gi_P$(3>0Dv=1UTH+!?7Hr%B${$>0}-!a=5rBo z->FllHl}f)DG@+R50nPCcZp0Gas2Ah-!D%9kmEiEFmqahz9Mf%H7@5=7h% z02fAy+JvYDPzF9YIC#C|I1-{0l}OUxnfXgZ6o@#$%s&Ibwanayh_h5RZ9&uqC=>8~ z{}E<>PBodV>})_Z0#E|+JZ}>suFMLKYQLr-8Uq+URK|a&p_*5!b|xVj1sD!z<9jHU z=o&d%XB=Qyi2?vzONkqkMZ{IE>u%N&v;r`MI067?=>(UOuhyAuYXC!te*(bNlt3iz z#&Mjby}iBfB@wU+Fod`V0OltNE=`}LhdiwV3?aS+0C%JbBw=3*iAYWglv^qQLx^&7 zUT)HNdz(!}asy4Nr3Ns3#o55jk1Iu%ozbtwV)61yrBYW3Ayt4OL^k0Ls9^r7&5Eu|DEfNlMpd z(xgdKr%#`LR7EE*M%! z1;9qY;g;zN!~4#vJYvI>!d(S$+_07)jU6NDM3I@dR;$%pRY^D7btOO)HxzPDUQBL&U|*EdQ@Y{&$0^ld^K#^ikcf=exE7TUA7O+<0*a zH0i-8gZ=FIuW6tD>o&=#l(H-ys$l>@Xye8SxW lEpciqn*-D&o&(eb_%C2Kw{Pw^XH5VA002ovPDHLkV1la~Gz|a% diff --git a/app/src/main/res/drawable-hdpi/icon_outgoing.png b/app/src/main/res/drawable-hdpi/icon_outgoing.png deleted file mode 100644 index a1ed640b843d2dcaabf60d3aefb0e81a5698bb94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2048 zcmV+b2>Px+x=BPqRCr$PoNH_pRTRh1neA4hR*S}@QL(K%XBV_27^`Ab)JPjO1N&h8n<#MNk7+0~nD&ME6<+)&NE%5YfF> zfi-{;2}E?SRbV9nZr{HBn0@>9Q6iD}-SfO{L^K#N9wY8bsmlQ1J^(m9gy1I6^WMp1 zGTl19p)1gJ-FeLXbZ!zv+{Vn;5z(hQ6US+zlzJ8bZjCU<4k9{1$3GN6rPTcZFw!S< zVWlBDj&nUCzM=zQBpV{qVxwi0KS>FAIn#MWxW9alM2}x2dI>K5ddz|g!iwR=Xp~znan3ae9B?#x~|R4Zw~vB z*_dC6Mgc0N1e^d2JP`3x+qORp>=={7mMvRahlYj(-kEt*dn>sD83vM=MMR4Y z=!BBUX0sWC%WT}Z zv8lek{w+kDlIOH8nM`)Iw6yfeYjFXb1^_FxBh@pUO++v0nMSwrZ)e_;yMmk=B7QEF zmrA9!zH!(>O?B4iP;UgYN$%w{G1!c5rZTF(OXQy}`_%F>_}olldv% zI4*$l9dSlXiQYj(PsXGzm!y3C$ak(>MY*whaB#4*t*ve6@OfhasFdQk67+TNCZb18 z&#`mo&LjH!`xi6wrFoV2F(P&n(JzJO8?68(m-~t6K~oU>`ufJ~-@jifZ+f2Q%KG~H zj^^g(KSr8oGy{|si;?@p_3PIs8yg#?^8UN+Ld50F+(ATpihW43H8(IY@SAV*4H32L ze5ge?6UuN2=VDw-MCa%PJd#a!cemBm)g_g8MV`&FhK7cYrlzL9bhQ0l9Qn>)Nks4K z_*4tPej;kn3Ao55_`f|sL|mFkBsyAKTL+@(mh!C%fU+5D+jeuQV2i!4l#b};(V|83y1To*D0;fSMFBdF z^D-jdpeq*EPIu=ctbUw+r7G|?0Eq2o7XbD&G&CHq`z0SIh_KqF0LHNv&c*s;GMSu` zTg-<|pwfOt0dC&BxjC6kZZRDsGyebpo#}L1HZn)`DA`nUT~`+0=b6mX^SlRi`>rPE zjYF#>K&8|j0Puw2$*a2I6eQP@03F9U84))Fz+pjzi`g>sE$MXnc~g3o)F}y2f>TOK zA7PfkK%XKaY2u9fp#{)&-C2Gc&{V>!i0EQdVwKd<0;rUd%U3SrlT8I{S=RJaD)oUW zy-Mk50hHie*ImHO4;u`084<}Ts!=_(0rvLx9_@MF7XUEcRK|xw6>0Fl3GI>c$OUus&HOnd$2%ryf?Xb>%)PUCzQGT;Ks$NsIFk@@833GEN+?c< zkpN2I*=+VA%d!NbRVtCN?=!O;%TS2e!_40U!1>HP3lS&iYQ_aIGC)bdb=^Ce`ElK3 zDrFZ3L?ZwNh~qd$lVt^xkL)b%}u>l$lAG>825pEDE$oSpfPFr8zH6 z`f4Ai5|K2}v_{zgN;IzPKEllRXhl{zqfK>nb?v$*TgwX2hbYUw$KqT&M`iDM-h@mh z)1#wPc7PI;zX2i7hs3puqm%oHHq1OZolbwLBT^B75}3agCY2cIA#RD; z)47KG&bmAT!xQ1E0yyll7Ldk{krboI%uCYg^yRvw^X;k zFA>q~Fz~9j0`rrRqjiWlgPG<3YUCk8QzvDmZF*PKr{}A-0t;1yf82P64>at-_rDNv z6*DggvSb^nLPr(A{3Lvs6PbA;B2EN=Gyt>|`g;~;{#u^El>bTqfOVxFeGPIsk6M5u zCE3^4*ElpZ)RIUf>X>=gz`($+wzjsvgFp#ld&mI{lDrAq8o-DYYXEBiBNB+{UaPOvd(XXsYFTu0000Px)7fD1xRCr$PoNrd+AP~SI>z-llw|bJT&+2*$^(5*^s<&{pKI=*BeyV$hwP7Dg z)20N%1ZIG=?Wbx<2tVc@!vxL_A1?yj>*~YBEGdAC%gbRgCtqyH_;SbuA2KfH#s9>& zIXhzW!P8UucOsu?01H@O`88+aX9^6GWwXKbX$H9zyG>AlYiNR9 zbpi$%wP16>*<)y!`TP})>5kFp19l_vuj1)NHM1#&QbzC)Q9%}q!EF2)yk zoCTCP8y!NBr~nt^%Mlm(1l_*b06~8z0Eq_hbA0~B7#~5$60@CP>>f+4y#Y#F$G?`7 zzQ9{goRr4z*{QFS@d8-F%RgdDlULse5S;-Q_KxLmUIR$sVo$s11aNVFe$54+q%eN0 zXK=NPodNEQgDb9nkGPVuy~u;{nz~`9*-TQX1&HZ+)lh&8qQ+LCnjwQNYyiaf zyc-FuBpMx}VQ`p&P%f3TQ+1u(0Enx;B{E%>0}Y}H9>EraZX6AO*t52dr!@Nz-Vg)A ztFkrf8o3FOF!n>0#L)0olAx;b7C?Oa*Yx8k5F^3UnWHU$6!uRS3VA_{2ybQ4*I}9b zdkY|y{X>Ho9bTEWuG_(FfQ0tX8)6FZN*zuIAUMQH1>Q;uj;GIS!CQav4k@9|RD6;{Wz-BpQUp6+pLIP{4{-gk!Y+_{{Qh=vE zV@-tC!=LKXQQh+0h= zTN3qQOe}zaIL~YC43Ma@JRECkZ07iF#`-)h0p*9c}Q_E-QmvF?Ez3Dwe(5UDXDym;!| z+@fvn3sb!3MgT7cL|t`46Ci;a*WJF0&9iBi)+Q1xO;z>PsxY=1>jp<*CPMV169jE- z3}#Jj2z9L~*qk#y%enZ&DPHwg^ji)z=ln4f;tH?AY&(r#@6udg znLvixX8S_@-j*ph1C-9>U;c(xq!?7 zkq`w(SmVXMkFKCn?ZXOCUVs_aU=Nb+e$8c@t}htCy;EfvJmX44N4kg&_rWUz>>el% zG(zn2Ark<7huA%5fQ3EW;Q+fUyiO`yr@o6$#TM_GgcsyQwCYTeHw35{MH3gv1Fb}C z58Hdk;&8}>Qyka^vbPXBdRufA-m;17<2(~O@~%~V;BlT!3!QDC)-Fm9o%7pdGdNOZ zGjVS_2f+r-D~z$-ob;SjTj!?VJlRf4Q&ek6*|6)pILCoqI*cNbgc67Dg`Hr^ zv!k(J|KHVPkWGLK$y_c+#YU6wLEHh3J0=Zdx=5idrYwH1j)IrptK;AgN5NxZPU}8o fUO25`(ml<8%W~*`0C(OO00000NkvXXu0mjf_fC5p literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/icon_remove.png b/app/src/main/res/drawable-hdpi/icon_remove.png deleted file mode 100644 index ff8c6c8fba9a57edd2bc641c10aa3968aa418688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 857 zcmV-f1E&0mP)Px&6G=otRCr$P+(C{~K@b4YY7XJjfy7h5EDSSVz+^VM(yd2uF-+naT$#*9mwEyq zCJtN!bn6|a42fhI1%7o`RaZ4B*1!5UkE;Gn|NlEdd{_dB6&=A4fXpNazyM?lFvBAQ z1CS}e437*9K&AjQJTkBr;Og@HdBXcE#B`Maen5h6{n_FR^ZYKte_fuxLBv-G@C*w7^pXq##QE?X$vD1+0Z=iKh;zjcAQm1yBpo170;i3S!PY(FHqt-4+{r57az_7#i7{jdm_@E z=(;^{?0nXE<{7xfDM9pr=LV2c&byiD1h)Av{ zauU%Tumo@Wg*_me0(RkTO0~CnT<^#OP1faX21vo%KK+_=ET=V$O80?M=fV=CKdy>fL8;t z2(TqQ?Q+frY!OcrF$=I|JSt-DdLkKc-SNslcQ7uwA5j|9l?W=Y{I5@J(}`n} j0cLn)U;r`&nBji_@e!APHSaGV00000NkvXXu0mjfyI*qe diff --git a/app/src/main/res/drawable-hdpi/icon_sos_dialer.png b/app/src/main/res/drawable-hdpi/icon_sos_dialer.png new file mode 100644 index 0000000000000000000000000000000000000000..a999b602b9b60699c122a8e199c4467304931dea GIT binary patch literal 2278 zcmVPx-ph-kQRCr$PoeOf^HVj3@m9$<->XkHENt%_^UP;}R#90YzypkSTeiHZrNP@bW z@i-n){9K)YAo!8nI$YlSuiLi$zHQr=ZQK6Xw(a%p_sh0zKb&*)Z(NHh;I!J~y(f?e zsP89b5LD03xxcjPfqcg(AP!b0Q2W*rV2`j~V<6BdRTM1mJz1VJ3w728z@_nq2jwXO zmiM0groV$9)zTEe)uP@+&o+bAXr=B+0k|dtq_!&6ULnprhg` zEX!gFtA3aqD^8`9Y{-YevKAEOnu~}$r%;Fc1l9_U`(7%9A3DHuR>X=Hi`t9u!vtVi zk6|522&**^F0xpwf(5HJ7_8Msg{hpdT7%$PEsnL95msv;ShTfk#!VAalE7+7DOr#Y zSuENzuYJHrL6yXlA{s9)DW4&MMJq;U-I2q$ATI?L1Lo-@mg*{CVdaAuGI<%TvL1_T zExJQaA>sS0tRQ7&ac^fKv5AmCOo0g2>V6iwLNR3WGFo9XMNUf*a>!9hFii^9N(=t> z5@BVjAT&8yrC_Zb&w9XDFLH2@OOt}Ns-Fe_N{*N8oc3GnS6u0U;Al1uatZfftu}86 zYbD1@QBHfXR_hL7t%`7vOKkakEKUVjD^4NB`}e?F#cE+Bs0a?1wbi2{xprZ1A*Yb? z{UfkU$Fwjns7y^p_GhOiYke{P{?!W14|W2FD<%spV^#~@A@|lh+%Ex(td)gmJgim+ zaJV9}!GhJ|q{RJHfl{!nSS{>)9?W?WSix#pS^0qJoq=!_gB9Siata{A4};*U1A6XJ$S&40t zsyLpz6I;z-1*>JLOTq(=mmpj!U>WtdsM>%_2rf0S zjQU%E%K}&dE{g}|!g4hNrfRX0F44l)vAvXls{t-`umW6GmNNsc2AI-EyMSeI$|uzb zajpv3x`AaJF6>n-gsV4L*5(saIk76D0IsfJ8F%KX`hY7FuI^wN4xUCy2`(BjK4oew zk}P}_p7M$Zv(V}cs>_tu5U>mfPgA&_-@XP+YtYoL026)R=+A?beh94Ruu5Yp$cBMs z+?kIssl>Xx_XO+_O!q)0s9p#%=N$bWehmd{5xB(st_q;;0YqIi0YB7&%>b6=k)lY~ zCb~u58n6}!L+pWw4)wo@Mf&pQWYfIqs7qzAF}1~tl?(r)e~wcA0_Aq;9;dQc30$jv zn|elGRY#9gf)%<&z@?9)n)R9%tVLp6`e?|MAntoj4Hn>%p(ZmI(UIfyU;(a7EM$_2 zb&XcQqUb#NTog>irLREqG?fXkk{B1@(uXRR&}6;LfCaev5w$C+%CR>E7T_8NSMi#E zb6_PwR7(fF4I@IZ;3B`vELa#V3L=xARkq({8Z5w-PlRB~EV#^r1-Jx}Da-2Asb2yt zz*R&;qxCC)2%j)hS!ApS!xXOqSO#KP2<-kf}U05tANKQspAK+RNtOPEL z=W=Dd!)cSe`&`R{mB2+`gB`ifd|C>WDt3cwX|ON_q=XKi?c?%bMGeBHP%OLQp^!-N zav88NVwB(|JCD~(frSxcHW;l5uLl-JjIGRMJ^yq$i{&7V>}KV7K<0_Jq4`S zsaPL2wF0aHun?9w73c%92bx_Gv2^z-oAJ7&+d=yT&e^22QFU z_1@FcXL9c2m$|C*GWg(!E-=;~7E9<&UetOW?uG_fLSQAn*HxC|oPH}CUXa1*StvdJ_{;<)e)@3g2hkqTH8c>>Qn8dL{~TfE-KR4 zDDt)xrbH@$Ric(c+5i|?FN)&NX2q(%RspaSV5!YAKsJk`Uv&&O0;IKXzr%Bbtys2$ zekKJhRtHd8iU^QV(3QGL%`ddl_pHfE(eLI9U^PqFH-p5Q5oE2gv8)r2Yg!1fYE+x( znE)Eqh^$)t`7Km2{!M=pMD+73tVk#t<&`%1KO`1Iq(H~7SO5S307*qoM6N<$g2xvg Apa1{> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/add_wechat_contact_background.xml b/app/src/main/res/drawable/add_wechat_contact_background.xml index d409088..cf1247a 100644 --- a/app/src/main/res/drawable/add_wechat_contact_background.xml +++ b/app/src/main/res/drawable/add_wechat_contact_background.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/badge_bg.xml b/app/src/main/res/drawable/badge_bg.xml index e952cbe..9fd6511 100644 --- a/app/src/main/res/drawable/badge_bg.xml +++ b/app/src/main/res/drawable/badge_bg.xml @@ -6,8 +6,8 @@ android:color="@color/red" /> + android:topLeftRadius="24dp" + android:topRightRadius="24dp" + android:bottomLeftRadius="24dp" + android:bottomRightRadius="24dp" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/dialog_background.xml b/app/src/main/res/drawable/dialog_background.xml new file mode 100644 index 0000000..eaf60cf --- /dev/null +++ b/app/src/main/res/drawable/dialog_background.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/app/src/main/res/drawable/sos_dialer_background.xml b/app/src/main/res/drawable/sos_dialer_background.xml new file mode 100644 index 0000000..4eb97ec --- /dev/null +++ b/app/src/main/res/drawable/sos_dialer_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tv_activation_normnl.xml b/app/src/main/res/drawable/tv_activation_normnl.xml new file mode 100644 index 0000000..13f8dac --- /dev/null +++ b/app/src/main/res/drawable/tv_activation_normnl.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/update_background.xml b/app/src/main/res/drawable/update_background.xml new file mode 100644 index 0000000..b904dbe --- /dev/null +++ b/app/src/main/res/drawable/update_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/update_cancel_background.xml b/app/src/main/res/drawable/update_cancel_background.xml new file mode 100644 index 0000000..58247be --- /dev/null +++ b/app/src/main/res/drawable/update_cancel_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_activation.xml b/app/src/main/res/layout/activity_activation.xml new file mode 100644 index 0000000..5fe3d9b --- /dev/null +++ b/app/src/main/res/layout/activity_activation.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_alarm_port.xml b/app/src/main/res/layout/activity_add_alarm_port.xml index 23a3923..f57a284 100644 --- a/app/src/main/res/layout/activity_add_alarm_port.xml +++ b/app/src/main/res/layout/activity_add_alarm_port.xml @@ -264,6 +264,7 @@ @@ -88,7 +90,8 @@ android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center" - android:layout_marginTop="16dp" + android:layout_marginTop="32dp" + android:layout_marginBottom="32dp" android:onClick="@{click::selectPic}" android:src="@drawable/default_avatar" app:is_circle="true" @@ -105,8 +108,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存至本机" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -145,8 +148,8 @@ android:maxLines="1" android:singleLine="true" android:text="姓名" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -163,8 +166,8 @@ android:inputType="text" android:maxLines="1" android:singleLine="true" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -203,8 +206,8 @@ android:maxLines="1" android:singleLine="true" android:text="号码" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -221,8 +224,8 @@ android:inputType="phone" android:maxLines="1" android:singleLine="true" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -242,8 +245,8 @@ android:layout_height="wrap_content" android:layout_marginStart="12dp" android:text="设为紧急联系人" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/activity_add_wechat_contact.xml b/app/src/main/res/layout/activity_add_wechat_contact.xml index 54f1146..1980404 100644 --- a/app/src/main/res/layout/activity_add_wechat_contact.xml +++ b/app/src/main/res/layout/activity_add_wechat_contact.xml @@ -14,12 +14,13 @@ + android:background="#FAF8F8"> @@ -116,8 +117,8 @@ android:maxLines="1" android:singleLine="true" android:text="姓名" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -134,8 +135,8 @@ android:inputType="text" android:maxLines="1" android:singleLine="true" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -174,8 +175,8 @@ android:maxLines="1" android:singleLine="true" android:text="号码" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -192,8 +193,8 @@ android:inputType="phone" android:maxLines="1" android:singleLine="true" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -232,8 +233,8 @@ android:maxLines="1" android:singleLine="true" android:text="微信" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -251,8 +252,8 @@ android:maxLines="1" android:singleLine="true" android:text="@string/app_name" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -272,8 +273,8 @@ android:layout_height="wrap_content" android:layout_marginStart="12dp" android:text="设为紧急联系人" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -289,6 +290,35 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_dailyapp.xml b/app/src/main/res/layout/activity_dailyapp.xml index 809de2c..2982829 100644 --- a/app/src/main/res/layout/activity_dailyapp.xml +++ b/app/src/main/res/layout/activity_dailyapp.xml @@ -6,6 +6,9 @@ + + android:background="#FAF8F8"> @@ -137,8 +138,8 @@ android:maxLines="1" android:singleLine="true" android:text="姓名" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -156,8 +157,8 @@ android:maxLines="1" android:singleLine="true" android:text="@{contact.name}" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -196,8 +197,8 @@ android:maxLines="1" android:singleLine="true" android:text="号码" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -215,8 +216,8 @@ android:maxLines="1" android:singleLine="true" android:text="@{contact.mobile}" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -255,8 +256,8 @@ android:maxLines="1" android:singleLine="true" android:text="微信" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -274,8 +275,8 @@ android:maxLines="1" android:singleLine="true" android:text="@{contact.tag}" - android:textColor="@color/white" - android:textColorHint="@color/gray" + android:textColor="@color/black" + android:textColorHint="@color/ok_button" android:textSize="16sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -295,8 +296,8 @@ android:layout_height="wrap_content" android:layout_marginStart="12dp" android:text="设为紧急联系人" - android:textColor="@color/white" - android:textSize="16sp" + android:textColor="@color/black" + android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/activity_emergency.xml b/app/src/main/res/layout/activity_emergency.xml index 5120623..238912d 100644 --- a/app/src/main/res/layout/activity_emergency.xml +++ b/app/src/main/res/layout/activity_emergency.xml @@ -6,25 +6,43 @@ + + + + app:layout_constraintTop_toBottomOf="@+id/imageView18" /> + android:layout_height="160dp" + app:layout_constraintBottom_toTopOf="@+id/constraintLayout7" + app:layout_constraintTop_toBottomOf="@+id/textView4" + tools:layout_editor_absoluteX="32dp" + tools:listitem="@layout/item_sosnumber" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d2d9dbc..877d120 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -44,7 +44,7 @@ + + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.3" /> + + + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.3" /> + + + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.3" /> + + + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.3" /> + + @@ -106,7 +110,7 @@ android:maxLines="1" android:text='@{float_window_enable?"已开启":"未开启"}' android:textColor="@{float_window_enable?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -131,9 +135,9 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:maxLines="1" - android:text="语音播报" + android:text="短信语音播报" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -143,11 +147,10 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginEnd="16dp" - android:onClick="@{click::testTts}" android:maxLines="1" android:text='@{voice_broadcast?"已开启":"未开启"}' android:textColor="@{voice_broadcast?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -171,9 +174,9 @@ android:layout_height="wrap_content" android:layout_marginStart="16dp" android:maxLines="1" - android:text="自动接听" + android:text="微信自动接听" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -187,7 +190,7 @@ android:maxLines="1" android:text='@{auto_accept?"已开启":"未开启"}' android:textColor="@{auto_accept?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -213,7 +216,7 @@ android:maxLines="1" android:text="拨号提示音" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -227,7 +230,7 @@ android:maxLines="1" android:text='@{dial_tone?"已开启":"未开启"}' android:textColor="@{dial_tone?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -254,7 +257,7 @@ android:maxLines="1" android:text="网络设置" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -267,7 +270,7 @@ android:maxLines="1" android:text="未开启" android:textColor="@color/setting_disable_color" - android:textSize="28sp" + android:textSize="25sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -304,7 +307,7 @@ android:maxLines="1" android:text="亮度字体设置" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -317,7 +320,7 @@ android:maxLines="1" android:text="未开启" android:textColor="@color/setting_disable_color" - android:textSize="28sp" + android:textSize="25sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -354,7 +357,7 @@ android:maxLines="1" android:text="防误触设置" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -367,7 +370,7 @@ android:maxLines="1" android:text="未开启" android:textColor="@color/setting_disable_color" - android:textSize="28sp" + android:textSize="25sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -404,7 +407,7 @@ android:maxLines="1" android:text="系统其他设置" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="25sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -417,7 +420,7 @@ android:maxLines="1" android:text="未开启" android:textColor="@color/setting_disable_color" - android:textSize="28sp" + android:textSize="25sp" android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" @@ -442,6 +445,55 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_touch.xml b/app/src/main/res/layout/activity_touch.xml index bc9f497..d2255f6 100644 --- a/app/src/main/res/layout/activity_touch.xml +++ b/app/src/main/res/layout/activity_touch.xml @@ -42,7 +42,7 @@ android:layout_marginStart="16dp" android:text="防止误触设置" android:textColor="@color/white" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -88,7 +88,7 @@ android:maxLines="1" android:text="音量键禁用" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -102,7 +102,7 @@ android:maxLines="1" android:text='@{disable_key?"已开启":"未开启"}' android:textColor="@{disable_key?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -128,7 +128,7 @@ android:maxLines="1" android:text="修改联系人禁用" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -142,7 +142,7 @@ android:maxLines="1" android:text='@{disable_contact?"已开启":"未开启"}' android:textColor="@{disable_contact?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -168,7 +168,7 @@ android:maxLines="1" android:text="设置访问禁用" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -182,7 +182,7 @@ android:maxLines="1" android:text="未开启" android:textColor="@color/setting_disable_color" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -207,7 +207,7 @@ android:maxLines="1" android:text="闹钟设置禁用" android:textColor="@color/black" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -221,7 +221,7 @@ android:maxLines="1" android:text='@{disable_clock?"已开启":"未开启"}' android:textColor="@{disable_clock?@color/setting_enable_color:@color/setting_disable_color}" - android:textSize="28sp" + android:textSize="24sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/activity_update.xml b/app/src/main/res/layout/activity_update.xml new file mode 100644 index 0000000..5c97bf5 --- /dev/null +++ b/app/src/main/res/layout/activity_update.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_wechat_call.xml b/app/src/main/res/layout/activity_wechat_call.xml index c211898..2569715 100644 --- a/app/src/main/res/layout/activity_wechat_call.xml +++ b/app/src/main/res/layout/activity_wechat_call.xml @@ -13,6 +13,13 @@ + + + + + + android:onClick="@{click::callWechatVoice}" + android:visibility="@{tag==true?View.VISIBLE:View.GONE}"> + android:onClick="@{click::callWechatVideo}" + android:visibility="@{tag==true?View.VISIBLE:View.GONE}"> - + app:layout_constraintTop_toTopOf="parent"> - - - - - - - + - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_contact.xml b/app/src/main/res/layout/fragment_contact.xml index a88b9a0..ba43821 100644 --- a/app/src/main/res/layout/fragment_contact.xml +++ b/app/src/main/res/layout/fragment_contact.xml @@ -22,6 +22,7 @@ @@ -92,6 +92,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="16dp" + android:onClick="@{click::toWeather}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent"> diff --git a/app/src/main/res/layout/fragment_record.xml b/app/src/main/res/layout/fragment_record.xml index b2dff0c..4a2b7cb 100644 --- a/app/src/main/res/layout/fragment_record.xml +++ b/app/src/main/res/layout/fragment_record.xml @@ -20,6 +20,7 @@ android:id="@+id/constraintLayout3" android:layout_width="match_parent" android:layout_height="48dp" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -43,7 +44,7 @@ android:layout_marginEnd="8dp" android:adjustViewBounds="true" android:scaleType="centerCrop" - android:src="@drawable/icon_delete" + android:src="@drawable/icon_menu" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -54,6 +55,8 @@ android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="0dp" + android:background="#FAF8F8" + tools:listitem="@layout/item_call_record" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 018dd7f..cdf29db 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -284,26 +284,39 @@ android:layout_width="330dp" android:layout_height="144dp" android:layout_marginTop="12dp" - android:background="@drawable/setting_card_location_background" + android:background="@drawable/card_location_background" android:onClick="@{click::getAddress}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@+id/cl_contact"> + + diff --git a/app/src/main/res/layout/item_call_record.xml b/app/src/main/res/layout/item_call_record.xml index 142f610..afd17bc 100644 --- a/app/src/main/res/layout/item_call_record.xml +++ b/app/src/main/res/layout/item_call_record.xml @@ -8,22 +8,34 @@ + + - - - diff --git a/app/src/main/res/layout/item_contact.xml b/app/src/main/res/layout/item_contact.xml index efa3245..7362384 100644 --- a/app/src/main/res/layout/item_contact.xml +++ b/app/src/main/res/layout/item_contact.xml @@ -8,9 +8,7 @@ - - + app:layout_constraintTop_toTopOf="parent" /> @@ -61,7 +48,7 @@ android:maxLines="1" android:singleLine="true" android:textColor="@color/black" - android:textSize="22sp" + android:textSize="30sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -76,11 +63,37 @@ android:singleLine="true" android:textColor="@color/black" android:textSize="14sp" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_name" tools:text="phone" /> + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_contact_wechat.xml b/app/src/main/res/layout/item_contact_wechat.xml index d5c92d6..5421c6c 100644 --- a/app/src/main/res/layout/item_contact_wechat.xml +++ b/app/src/main/res/layout/item_contact_wechat.xml @@ -43,9 +43,11 @@ app:layout_constraintVertical_bias="0.126" /> @@ -57,7 +59,7 @@ android:maxLines="1" android:singleLine="true" android:textColor="@color/white" - android:textSize="36sp" + android:textSize="30sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" diff --git a/app/src/main/res/layout/item_daily_app.xml b/app/src/main/res/layout/item_daily_app.xml index 1c0e92c..f2868fe 100644 --- a/app/src/main/res/layout/item_daily_app.xml +++ b/app/src/main/res/layout/item_daily_app.xml @@ -13,15 +13,33 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> + + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.4" /> + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a8caf91..fef054c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -27,7 +27,10 @@ #F1B3B3 #2a2b35 #8e6afb - + #808080 + #99FFFFFF + #ffffff + #ff5257 #00D56B #ffffff @@ -41,7 +44,7 @@ #FDF6DC #eae8e8 - #bbbaba + #B5B5B5 #182237 #858585 #F44250 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 08997d2..5aebe6d 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -9,13 +9,21 @@ @color/colorPrimary + + + +