diff --git a/FlycoTabLayoutZ_Lib/build.gradle b/FlycoTabLayoutZ_Lib/build.gradle index 3c6ae3c..0f43451 100644 --- a/FlycoTabLayoutZ_Lib/build.gradle +++ b/FlycoTabLayoutZ_Lib/build.gradle @@ -15,10 +15,6 @@ android { buildTypes { M50T60Debug {} M50T60Release {} - U807Debug {} - U807Release {} - iPlay50SEDebug {} - iPlay50SERelease {} debug {} release {} } diff --git a/app/build.gradle b/app/build.gradle index fe45dd0..eb6a7cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.xxpatx.os" minSdkVersion 24 targetSdkVersion 29 - versionCode 1040 - versionName "1.4.0" + versionCode 1042 + versionName "1.4.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -83,7 +83,7 @@ android { manifestPlaceholders = [ AMAP_KEY: "aa85f12a2b0060a687c1755e08161875" ] - buildConfigField "String", "platform", '"TD606"' + buildConfigField "String", "platform", '"M50"' versionNameSuffix "-debug" debuggable true signingConfig signingConfigs.M50T60 @@ -94,7 +94,7 @@ android { manifestPlaceholders = [ AMAP_KEY: "aa85f12a2b0060a687c1755e08161875" ] - buildConfigField "String", "platform", '"TD606"' + buildConfigField "String", "platform", '"M50"' signingConfig signingConfigs.M50T60 } @@ -233,7 +233,7 @@ dependencies { implementation 'com.github.hackware1993:MagicIndicator:1.7.0' // for androidx implementation 'com.king.view:circleprogressview:1.1.2' //工具类 - implementation 'com.blankj:utilcodex:1.31.0' + implementation 'com.blankj:utilcodex:1.31.1' //aria implementation 'com.arialyy.aria:core:3.8.15' annotationProcessor 'com.arialyy.aria:compiler:3.8.15' diff --git a/app/keystore/xueshibaoos.cer b/app/keystore/xueshibaoos.cer new file mode 100644 index 0000000..33a683e Binary files /dev/null and b/app/keystore/xueshibaoos.cer differ diff --git a/app/keystore/xueshibaoos.pem b/app/keystore/xueshibaoos.pem new file mode 100644 index 0000000..087f02e --- /dev/null +++ b/app/keystore/xueshibaoos.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIEqDCCA5CgAwIBAgIJALOZgIbQVs/6MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g +VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE +AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe +Fw0wODA0MTUyMjQwNTBaFw0zNTA5MDEyMjQwNTBaMIGUMQswCQYDVQQGEwJVUzET +MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G +A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p +ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI +hvcNAQEBBQADggENADCCAQgCggEBAJx4BZKsDV04HN6qZezIpgBuNkgMbXIHsSAR +vlCGOqvitV0Amt9xRtbyICKAx81Ne9smJDuKgGwms0sTdSOkkmgiSQTcAUk+fArP +GgXIdPabA3tgMJ2QdNJCgOFrrSqHNDYZUer3KkgtCbIEsYdeEqyYwap3PWgAuer9 +5W1Yvtjo2hb5o2AJnDeoNKbf7be2tEoEngeiafzPLFSW8s821k35CjuNjzSjuqtM +9TNxqydxmzulh1StDFP8FOHbRdUeI0+76TybpO35zlQmE1DsU1YHv2mi/0qgfbX3 +6iANCabBtJ4hQC+J7RGQiTqrWpGA8VLoL4WkV1PPX8GQccXuyCcCAQOjgfwwgfkw +HQYDVR0OBBYEFE/koLPdnLop9x1yh8Tnw48ghsKZMIHJBgNVHSMEgcEwgb6AFE/k +oLPdnLop9x1yh8Tnw48ghsKZoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE +CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH +QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG +CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJALOZgIbQVs/6MAwGA1Ud +EwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBAFclUbjZOh9z3g9tRp+G2tZwFAAp +PIigzXzXeLc9r8wZf6t25iEuVsHHYc/EL9cz3lLFCuCIFM78CjtaGkNGBU2Cnx2C +tCsgSL+ItdFJKe+F9g7dEtctVWV+IuPoXQTIMdYT0Zk4u4mCJH+jISVroS0dao+S +6h2xw3Mxe6DAN/DRr/ZFrvIkl5+6bnoUvAJccbmBOM7z3fwFlhfPJIRc97QNY4L3 +J17XOElatuWTG5QhdlxJG3L7aOCA29tYwgKdNHyLMozkPvaosVUz7fvpib1qSN1L +IC7alMarjdW4OZID2q4u1EYjLk/pvZYTlMYwDlE448/Shebk5INTjLixs1c= +-----END CERTIFICATE----- diff --git a/app/src/main/java/com/xxpatx/os/activity/contact/AddContactActivity.java b/app/src/main/java/com/xxpatx/os/activity/contact/AddContactActivity.java index 98e92a7..585c5ad 100644 --- a/app/src/main/java/com/xxpatx/os/activity/contact/AddContactActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/contact/AddContactActivity.java @@ -9,6 +9,7 @@ import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.Nullable; import androidx.lifecycle.Observer; @@ -25,6 +26,7 @@ import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.interfaces.OnResultCallbackListener; import com.tencent.mmkv.MMKV; import com.xiasuhuei321.loadingdialog.view.LoadingDialog; +import com.xxpatx.os.BuildConfig; import com.xxpatx.os.R; import com.xxpatx.os.base.mvvm.BaseMvvmActivity; import com.xxpatx.os.bean.Contact; @@ -35,6 +37,7 @@ import com.xxpatx.os.db.ContactCacheUtils; import com.xxpatx.os.utils.ContactsUtils; import com.xxpatx.os.utils.LocalContactUtils; import com.xxpatx.os.utils.ScreenUtil; +import com.zackratos.ultimatebarx.ultimatebarx.UltimateBarXKt; import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; import java.io.ByteArrayOutputStream; @@ -52,7 +55,11 @@ public class AddContactActivity extends BaseMvvmActivity DEFAULT_DOCK_APP = new ArrayList() { - private static final long serialVersionUID = -7406071324804131303L; - - { - this.add(new DockApp("xxpatx.os.dialer")); - this.add(new DockApp("com.tencent.mm")); - this.add(new DockApp("com.ss.android.ugc.aweme")); - this.add(new DockApp("com.mediatek.camera")); - } - }; - public static final List INCLUDE_SYSTEM_APP =new ArrayList(){{ this.add("com.android.mms");//信息 this.add("com.mediatek.camera"); diff --git a/app/src/main/java/com/xxpatx/os/activity/main/MainActivity.java b/app/src/main/java/com/xxpatx/os/activity/main/MainActivity.java index 589f925..e0824c7 100644 --- a/app/src/main/java/com/xxpatx/os/activity/main/MainActivity.java +++ b/app/src/main/java/com/xxpatx/os/activity/main/MainActivity.java @@ -25,9 +25,11 @@ import android.speech.tts.TextToSpeech; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.util.Log; import android.view.KeyEvent; import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -40,6 +42,7 @@ import androidx.lifecycle.Observer; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.download.DownloadEntity; +import com.blankj.utilcode.util.BarUtils; import com.blankj.utilcode.util.NetworkUtils; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -69,6 +72,7 @@ import com.xxpatx.os.fragment.contact.ContactFragment; import com.xxpatx.os.fragment.home.HomeFragment; import com.xxpatx.os.fragment.settings.SettingsFragment; import com.xxpatx.os.manager.AmapManager; +import com.xxpatx.os.manager.DesktopIconManager; import com.xxpatx.os.service.NotificationService; import com.xxpatx.os.utils.ApkUtils; import com.xxpatx.os.utils.AppUsedTimeUtils; @@ -77,6 +81,7 @@ import com.xxpatx.os.utils.DayUtils; import com.xxpatx.os.utils.TimeUtils; import com.xxpatx.os.utils.Utils; import com.xxpatx.os.view.ScaleCircleNavigator; +import com.zackratos.ultimatebarx.ultimatebarx.UltimateBarXKt; import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX; import net.lucode.hackware.magicindicator.ViewPagerHelper; @@ -143,7 +148,11 @@ public class MainActivity extends BaseMvvmActivity 1) { @@ -293,8 +335,34 @@ public class MainActivity extends BaseMvvmActivity 0) { + result = getResources().getDimensionPixelSize(resourceId); + } + return result; + } + + + /** + * 设置页面最外层布局 FitsSystemWindows 属性 + * + * @param value + */ + public void setFitsSystemWindows(boolean value) { + ViewGroup contentFrameLayout = findViewById(android.R.id.content); + View parentView = contentFrameLayout.getChildAt(0); + if (parentView != null && Build.VERSION.SDK_INT >= 14) { + parentView.setFitsSystemWindows(value); + } + } + + private View.OnSystemUiVisibilityChangeListener mOnSystemUiVisibilityChangeListener = new View.OnSystemUiVisibilityChangeListener() { @Override @@ -773,20 +841,20 @@ public class MainActivity extends BaseMvvmActivity() { + @Override + public void onChanged(SystemSettings systemSettings) { + + } + }); + } @Override protected void onResume() { super.onResume(); setStatus(); + mViewModel.getSystemSettings(); } private void setStatus() { @@ -121,6 +130,10 @@ public class SettingActivity extends BaseMvvmActivity systemSettingsBaseResponse) { + Log.e("getSystemSettings", "onNext: " + systemSettingsBaseResponse); + if (systemSettingsBaseResponse.code == 200) { + SystemSettings systemSettings = systemSettingsBaseResponse.data; + mSystemSettingsData.setValue(systemSettings); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getSystemSettings", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getSystemSettings", "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/xxpatx/os/base/BaseApplication.java b/app/src/main/java/com/xxpatx/os/base/BaseApplication.java index 543a135..2731d24 100644 --- a/app/src/main/java/com/xxpatx/os/base/BaseApplication.java +++ b/app/src/main/java/com/xxpatx/os/base/BaseApplication.java @@ -24,6 +24,7 @@ import com.xxpatx.os.manager.AmapManager; import com.xxpatx.os.manager.AppManager; import com.xxpatx.os.manager.AppStatusManager; import com.xxpatx.os.manager.ConnectManager; +import com.xxpatx.os.manager.DesktopIconManager; import com.xxpatx.os.network.NetInterfaceManager; import com.xxpatx.os.push.PushManager; import com.xxpatx.os.service.main.MainService; @@ -80,6 +81,7 @@ public class BaseApplication extends Application { } WechatContactManager.init(this); ContactCacheUtils.init(this); + DesktopIconManager.init(this); } private void aliyunPushInit() { diff --git a/app/src/main/java/com/xxpatx/os/bean/DesktopIcon.java b/app/src/main/java/com/xxpatx/os/bean/DesktopIcon.java index ac5b768..6d330c8 100644 --- a/app/src/main/java/com/xxpatx/os/bean/DesktopIcon.java +++ b/app/src/main/java/com/xxpatx/os/bean/DesktopIcon.java @@ -102,6 +102,8 @@ public class DesktopIcon implements Serializable, Parcelable { return context.getDrawable(R.drawable.icon_wechat_service); case AppManager.CONTACT_PACKAGE: return context.getDrawable(R.drawable.com_android_contacts); + case AppManager.EXIT_DESKTOP: + return context.getDrawable(R.drawable.exit_icon); case "aios.daily.app": return context.getDrawable(R.drawable.icon_daily_app); case "aios.appstore": diff --git a/app/src/main/java/com/xxpatx/os/config/CommonConfig.java b/app/src/main/java/com/xxpatx/os/config/CommonConfig.java index 47697f8..f73f796 100644 --- a/app/src/main/java/com/xxpatx/os/config/CommonConfig.java +++ b/app/src/main/java/com/xxpatx/os/config/CommonConfig.java @@ -6,8 +6,16 @@ public class CommonConfig { /*保存的应用版本号*/ public final static String APP_VERSION_CODE = "APP_VERSION_CODE"; + + /*桌面图标列数*/ + public static final String DESKTOP_LAYOUT_COLUMNS = "desktop_layout_columns"; + public static final int DESKTOP_LAYOUT_COLUMNS_SIZE = 2; + /*桌面图标行数*/ + public static final String DESKTOP_LAYOUT_ROWS = "desktop_layout_rows"; + public static final int DESKTOP_LAYOUT_ROWS_SIZE = 3; + /*桌面图标个数*/ - public final static int DESKTOP_LIST_SIZE = 3 * 3; + public final static int DESKTOP_LIST_SIZE = DESKTOP_LAYOUT_COLUMNS_SIZE * DESKTOP_LAYOUT_ROWS_SIZE; public static final String HIDE_CALENDAR_KEY = "hide_desktop_calendar"; @@ -106,7 +114,8 @@ public class CommonConfig { public static final String DISABLE_CLOCK_MODIFY = "disable_clock_modify_key"; /*联系人首屏*/ public static final String CONTACT_HOME_KEY = "contact_home_control"; - + /*整点报时*/ + public static final String HOURLY_TIME_SIGNAL_KEY = "Hourly_Time_Signal"; /*后台设置的*/ /*主页按钮开关*/ diff --git a/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java b/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java index c65def7..5809c7d 100644 --- a/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java +++ b/app/src/main/java/com/xxpatx/os/fragment/app/AppListFragment.java @@ -46,6 +46,7 @@ import com.xxpatx.os.shortcut.ShortcutUtils; import com.xxpatx.os.utils.ApkUtils; import com.xxpatx.os.utils.AppUsedTimeUtils; import com.xxpatx.os.utils.IconUtils; +import com.xxpatx.os.utils.Utils; import com.xxpatx.os.view.MyGridLayout; import java.util.ArrayList; @@ -135,7 +136,7 @@ public class AppListFragment extends BaseFragment { // if (mContext.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // gridLayout.set(3, 3); // } else { - gridLayout.set(2, 3); + gridLayout.set(CommonConfig.DESKTOP_LAYOUT_COLUMNS_SIZE, CommonConfig.DESKTOP_LAYOUT_ROWS_SIZE); // } gridLayout.setGridAdapter(new MyGridLayout.GridAdatper() { @@ -298,6 +299,9 @@ public class AppListFragment extends BaseFragment { AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); // SendRunningApp(mContext); break; + case AppManager.EXIT_DESKTOP: + Utils.openLauncher3(mContext); + break; default: int setting_other_appInstaller = Settings.Global.getInt(mContext.getContentResolver(), CommonConfig.SETTING_OTHER_APPINSTALLER_KEY, 1); if (setting_other_appInstaller == 0 @@ -329,6 +333,7 @@ public class AppListFragment extends BaseFragment { case "com.xxpatx.sn": case "aios.daily.app": case "aios.appstore": + case AppManager.EXIT_DESKTOP: break; default: showHideDialog(desktopIcon); @@ -433,7 +438,7 @@ public class AppListFragment extends BaseFragment { dailyAppDialog.show(); } - private void SendRunningApp(Context context) { + private void sendRunningApp(Context context) { String packageName = AppUsedTimeUtils.getInstance().getAppPackageName(); long time = AppUsedTimeUtils.getInstance().getStartTime(); JsonObject jsonObject = new JsonObject(); @@ -441,29 +446,29 @@ public class AppListFragment extends BaseFragment { jsonObject.addProperty("version_name", ApkUtils.getAPPVersionName(context, packageName)); jsonObject.addProperty("start_time", time / 1000); String jsonString = jsonObject.toString(); - Log.e(TAG, "SendRunningApp: " + jsonString); + Log.e(TAG, "sendRunningApp: " + jsonString); NetInterfaceManager.getInstance() .getRunningAppObservable(jsonString) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - Log.e("SendRunningApp", "onSubscribe: "); + Log.e("sendRunningApp", "onSubscribe: "); } @Override public void onNext(BaseResponse baseResponse) { - Log.e("SendRunningApp", "onSubscribe: " + baseResponse); + Log.e("sendRunningApp", "onSubscribe: " + baseResponse); } @Override public void onError(Throwable e) { - Log.e("SendRunningApp", "onError: " + e.getMessage()); + Log.e("sendRunningApp", "onError: " + e.getMessage()); onComplete(); } @Override public void onComplete() { - Log.e("SendRunningApp", "onComplete: "); + Log.e("sendRunningApp", "onComplete: "); } }); } diff --git a/app/src/main/java/com/xxpatx/os/fragment/contact/ContactViewModel.java b/app/src/main/java/com/xxpatx/os/fragment/contact/ContactViewModel.java index 2296723..c4f0e00 100644 --- a/app/src/main/java/com/xxpatx/os/fragment/contact/ContactViewModel.java +++ b/app/src/main/java/com/xxpatx/os/fragment/contact/ContactViewModel.java @@ -55,6 +55,7 @@ public class ContactViewModel extends BaseViewModel() { + @Override + public void onChanged(@Nullable WeatherNowBean.NowBaseBean nowBaseBean) { + mViewDataBinding.tvTemp.setText(nowBaseBean.getTemp() + "℃"); + if (DayUtils.isNight()) { +// mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_night)); + } else { + switch (nowBaseBean.getIcon()) { + default: + case "100": + case "150": + //晴 +// mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather)); + break; + case "102": + case "152": + //少云 +// mViewDataBinding.clWeather.setBackground(mContext.getDrawable(R.drawable.custom_bg_weather_rain)); + break; + } + } +// mViewDataBinding.tvWeather.setText(nowBaseBean.getText()); + } + }); + + LiveEventBus + .get("getWeather24HourlyKey", WeatherHourlyBean.HourlyBean.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable WeatherHourlyBean.HourlyBean hourlyBean) { + String imageName = "he" + hourlyBean.getIcon(); + Log.e(TAG, "onSuccess: " + imageName); + if (isAdded()) { + int resId = getResources().getIdentifier(imageName, "drawable", mContext.getPackageName()); +// Log.e(TAG, "onSuccess: " + resId); +// if (resId == 0) { +// mViewDataBinding.ivPic.setImageDrawable(mContext.getDrawable(R.drawable.he100)); +// } else { +// mViewDataBinding.ivPic.setImageDrawable(mContext.getDrawable(resId)); +// } + mViewDataBinding.tvTemp.setText(hourlyBean.getTemp() + "℃"); + } + } + }); + + LiveEventBus + .get("getWeather7DKey", WeatherDailyBean.DailyBean.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable WeatherDailyBean.DailyBean dailyBean) { + mViewDataBinding.tvWeather.setText(dailyBean.getTempMin() + "℃ - " + dailyBean.getTempMax() + "℃"); + } + }); + + LiveEventBus + .get("time", String.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable String s) { + mViewDataBinding.tvTime.setText(s); + } + }); + + LiveEventBus + .get("date", String.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable String s) { + mViewDataBinding.tvData.setText(s); + } + }); + + LiveEventBus + .get("week", String.class) + .observe(this, new Observer() { + @Override + public void onChanged(@Nullable String s) { + mViewDataBinding.tvWeek.setText(s); + } + }); + LiveEventBus.get(CommonConfig.AMAP_LOCATION_MAP_BEAN, MapBean.class) .observe(this, new Observer() { @Override @@ -126,6 +215,12 @@ public class SettingsFragment extends BaseMvvmFragment getDefaultDockApp() { + List dockApps = new ArrayList<>(); + dockApps.add(new DockApp("xxpatx.os.dialer")); + dockApps.add(new DockApp("com.tencent.mm")); + dockApps.add(new DockApp("com.ss.android.ugc.aweme")); + dockApps.add(new DockApp(getDefaultCameraPackageName())); + return dockApps; + } + + public String getDefaultCameraPackageName() { + Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + List cameras = mContext.getPackageManager().queryIntentActivities(cameraIntent, 0); + // 默认情况下,第一个返回的应用就是默认相机 + if (!cameras.isEmpty()) { + return cameras.get(0).activityInfo.packageName; + } + return "com.android.camera2"; // 没有找到相机应用 + } + + +} 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 dc7aa63..306f130 100644 --- a/app/src/main/java/com/xxpatx/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/xxpatx/os/network/NetInterfaceManager.java @@ -1115,32 +1115,32 @@ public class NetInterfaceManager { void onComplete(); } - public void getSystemSettings(boolean refresh, BehaviorSubject lifecycle, ContactCallback callback) { - ConnectMode connectMode = ConnectMode.ONE_MINUTE; - if (refresh) { - connectMode = ConnectMode.DEFAULT; - } - if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_SETTINGS, connectMode)) { - getSystemSettings(lifecycle, callback); - } else { - String jsonString = mCacheHelper.getAsString(UrlAddress.GET_SETTINGS); - //为 "" 是已经请求成功的 - if (jsonString == null) { - getSystemSettings(lifecycle, callback); - } else { - Gson gson = new Gson(); - Type type = new TypeToken>() { - }.getType(); - List setting_sos = gson.fromJson(jsonString, type); - if (setting_sos == null || setting_sos.size() == 0) { - if (callback != null) callback.setEmpty(); - } else { - if (callback != null) callback.setContact(setting_sos); - } - if (callback != null) callback.onComplete(); - } - } - } +// public void getSystemSettings(boolean refresh, BehaviorSubject lifecycle, ContactCallback callback) { +// ConnectMode connectMode = ConnectMode.ONE_MINUTE; +// if (refresh) { +// connectMode = ConnectMode.DEFAULT; +// } +// if (ConnectManager.getInstance().isNeedConnect(UrlAddress.GET_SETTINGS, connectMode)) { +// getSystemSettings(lifecycle, callback); +// } else { +// String jsonString = mCacheHelper.getAsString(UrlAddress.GET_SETTINGS); +// //为 "" 是已经请求成功的 +// if (jsonString == null) { +// getSystemSettings(lifecycle, callback); +// } else { +// Gson gson = new Gson(); +// Type type = new TypeToken>() { +// }.getType(); +// List setting_sos = gson.fromJson(jsonString, type); +// if (setting_sos == null || setting_sos.size() == 0) { +// if (callback != null) callback.setEmpty(); +// } else { +// if (callback != null) callback.setContact(setting_sos); +// } +// if (callback != null) callback.onComplete(); +// } +// } +// } public void getSystemSettings(BehaviorSubject lifecycle, ContactCallback callback) { getSettingControl() 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 a76cbca..726106b 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 @@ -6,6 +6,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.PixelFormat; +import android.media.AudioAttributes; +import android.media.SoundPool; import android.os.Build; import android.os.IBinder; import android.os.PowerManager; @@ -73,6 +75,9 @@ public class MainService extends BaseRxService implements MainSContact.MainSView private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); public MainSPresenter mPresenter; + private SoundPool mSoundPool; + private HashMap soundMap = new HashMap<>(); + private boolean mFloatWindowEnable; private WindowManager mWindowManager; private View mBallView; @@ -155,6 +160,38 @@ public class MainService extends BaseRxService implements MainSContact.MainSView // ApkUtils.UninstallAPP(this, "com.joytv.live"); // ApkUtils.UninstallAPP(this, "com.tencent.android.qqdownloader"); + AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM) // 设置音效使用场景 + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build(); // 设置音效的类型 + mSoundPool = new SoundPool.Builder().setAudioAttributes(attr) // 设置音效池的属性 + .setMaxStreams(12) // 设置最多可容纳10个音频流 + .build(); // ① + // load方法加载指定音频文件,并返回所加载的音效ID + // 此处使用HashMap来管理这些音频流 + soundMap.put(0, mSoundPool.load(MainService.this, R.raw.time_am12, 1)); + soundMap.put(1, mSoundPool.load(MainService.this, R.raw.time_am1, 1)); + soundMap.put(2, mSoundPool.load(MainService.this, R.raw.time_am2, 1)); + soundMap.put(3, mSoundPool.load(MainService.this, R.raw.time_am3, 1)); + soundMap.put(4, mSoundPool.load(MainService.this, R.raw.time_am4, 1)); + soundMap.put(5, mSoundPool.load(MainService.this, R.raw.time_am5, 1)); + soundMap.put(6, mSoundPool.load(MainService.this, R.raw.time_am6, 1)); + soundMap.put(7, mSoundPool.load(MainService.this, R.raw.time_am7, 1)); + soundMap.put(8, mSoundPool.load(MainService.this, R.raw.time_am8, 1)); + soundMap.put(9, mSoundPool.load(MainService.this, R.raw.time_am9, 1)); + soundMap.put(10, mSoundPool.load(MainService.this, R.raw.time_am10, 1)); + soundMap.put(11, mSoundPool.load(MainService.this, R.raw.time_am11, 1)); + soundMap.put(12, mSoundPool.load(MainService.this, R.raw.time_pm12, 1)); + soundMap.put(13, mSoundPool.load(MainService.this, R.raw.time_pm1, 1)); + soundMap.put(14, mSoundPool.load(MainService.this, R.raw.time_pm2, 1)); + soundMap.put(15, mSoundPool.load(MainService.this, R.raw.time_pm3, 1)); + soundMap.put(16, mSoundPool.load(MainService.this, R.raw.time_pm4, 1)); + soundMap.put(17, mSoundPool.load(MainService.this, R.raw.time_pm5, 1)); + soundMap.put(18, mSoundPool.load(MainService.this, R.raw.time_pm6, 1)); + soundMap.put(19, mSoundPool.load(MainService.this, R.raw.time_pm7, 1)); + soundMap.put(20, mSoundPool.load(MainService.this, R.raw.time_pm8, 1)); + soundMap.put(21, mSoundPool.load(MainService.this, R.raw.time_pm9, 1)); + soundMap.put(22, mSoundPool.load(MainService.this, R.raw.time_pm10, 1)); + soundMap.put(23, mSoundPool.load(MainService.this, R.raw.time_pm11, 1)); + mFloatWindowEnable = Settings.Global.getInt(getContentResolver(), CommonConfig.HOVER_HOME, CommonConfig.HOVER_HOME_STATUS) == 1; mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); showPopupWindow(); @@ -180,6 +217,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView registerAlarmReceiver(); registerTimeReceiver(); + registFastCallReceive(); registerLockScreenReceiver(); registerOperateAlarmClockReceiver(); registerScreenLockReceiver(); @@ -228,6 +266,9 @@ public class MainService extends BaseRxService implements MainSContact.MainSView if (mTimeChangedReceiver != null) { unregisterReceiver(mTimeChangedReceiver); } + if (mTimeSignalReceiver != null) { + unregisterReceiver(mTimeSignalReceiver); + } if (lockScreenReceiver != null) { unregisterReceiver(lockScreenReceiver); } @@ -341,6 +382,51 @@ public class MainService extends BaseRxService implements MainSContact.MainSView Log.e(TAG, "TimeChangedReceiver:" + "timezone changed"); } else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) { Log.e(TAG, "TimeChangedReceiver:" + "time tick"); + hourlyTimeSignal(); + } + } + } + + private void hourlyTimeSignal() { + boolean hourly_time = mMMKV.decodeBool(CommonConfig.HOURLY_TIME_SIGNAL_KEY, false); + if (hourly_time) { + Calendar cal = Calendar.getInstance(); + int hour = cal.get(Calendar.HOUR_OF_DAY); + Log.e(TAG, "hourlyTimeSignal: hour = " + hour); + int min = cal.get(Calendar.MINUTE); + Log.e(TAG, "hourlyTimeSignal: min = " + min); + if (min == 0) { + mSoundPool.play(soundMap.get(hour), 1, 1, 0, 0, 1); + } + } else { + Log.e(TAG, "hourlyTimeSignal: not enable hourly time signal"); + } + } + + private void registFastCallReceive() { + if (null == mTimeSignalReceiver) { + mTimeSignalReceiver = new TimeSignalReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.addAction(HOURLY_TIME_SIGNAL_KEY); + registerReceiver(mTimeSignalReceiver, filter); + } + + private TimeSignalReceiver mTimeSignalReceiver; + + private static final String HOURLY_TIME_SIGNAL_KEY = "hourly_time_signal"; + + private class TimeSignalReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.e("TimeSignalReceiver", "onReceive: " + action); + if (HOURLY_TIME_SIGNAL_KEY.equals(action)) { + int hour_notify = intent.getIntExtra("hour_notify", 0); + Log.e("TimeSignalReceiver", "onReceive: hour_notify = " + hour_notify); + mMMKV.encode(CommonConfig.HOURLY_TIME_SIGNAL_KEY, hour_notify == 1); + } } } 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 df84b0e..3875d2e 100644 --- a/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java +++ b/app/src/main/java/com/xxpatx/os/utils/ApkUtils.java @@ -10,9 +10,11 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.os.Binder; import android.os.Build; +import android.os.SystemProperties; import android.provider.Settings; import android.text.TextUtils; import android.util.ArraySet; @@ -447,6 +449,14 @@ public class ApkUtils { desktopIcons.add(contactIcon); } + if (isTablet()) { + DesktopIcon exitIcon = new DesktopIcon(); +// exitIcon.setIcon(context.getDrawable(R.drawable.exit_icon)); + exitIcon.setTitle("退出桌面"); + exitIcon.setPackage(AppManager.EXIT_DESKTOP); + desktopIcons.add(exitIcon); + } + List shortcutPkgInfos = ShortcutUtils.getInstance().getShortcutList(); desktopIcons.addAll(shortcutPkgInfos); @@ -454,6 +464,21 @@ public class ApkUtils { return desktopIcons; } + /*https://dev.mi.com/console/doc/detail?pId=2768*/ + public static boolean isTablet() { + Log.e(TAG, "isTablet: " + SystemProperties.get("ro.build.characteristics")); + Log.e(TAG, "isTablet: " + Utils.getProperty("ro.build.characteristics", "unknow")); + /**应用需反射调用*/ + return SystemProperties.get("ro.build.characteristics").contains("tablet"); + } + + public static boolean isTablet(Context context) { + boolean isTablet = (context.getResources().getConfiguration().screenLayout + & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE; + Log.e(TAG, "isTablet: " + isTablet); + return isTablet; + } + public static boolean isSystemApp(Context context, String pkg) { PackageManager pm = context.getPackageManager(); ApplicationInfo applicationInfo = null; diff --git a/app/src/main/java/com/xxpatx/os/utils/StatusBarUtil.java b/app/src/main/java/com/xxpatx/os/utils/StatusBarUtil.java new file mode 100644 index 0000000..016257f --- /dev/null +++ b/app/src/main/java/com/xxpatx/os/utils/StatusBarUtil.java @@ -0,0 +1,344 @@ +package com.xxpatx.os.utils; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Color; +import android.os.Build; +import android.os.Environment; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Properties; + +public class StatusBarUtil { + public static int screenWidth; + public static int screenHeight; + public static int navigationHeight = 0; + + private static DisplayMetrics mMetrics; + public static final String HOME_CURRENT_TAB_POSITION = "HOME_CURRENT_TAB_POSITION"; + + public static final String SYS_EMUI = "sys_emui"; + public static final String SYS_MIUI = "sys_miui"; + public static final String SYS_FLYME = "sys_flyme"; + private static final String KEY_MIUI_VERSION_CODE = "ro.miui.ui.version.code"; + private static final String KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name"; + private static final String KEY_MIUI_INTERNAL_STORAGE = "ro.miui.internal.storage"; + private static final String KEY_EMUI_API_LEVEL = "ro.build.hw_emui_api_level"; + private static final String KEY_EMUI_VERSION = "ro.build.version.emui"; + private static final String KEY_EMUI_CONFIG_HW_SYS_VERSION = "ro.confg.hw_systemversion"; + + public static void init(Activity activity) { + ViewGroup contentLayout = activity.getWindow().getDecorView().findViewById(Window.ID_ANDROID_CONTENT); + StatusBarUtil.setStatusBar(activity, false, true); + StatusBarUtil.setStatusTextColor(true, activity); + StatusBarUtil.setStatusBarPadding(activity, contentLayout); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.transparent)); + } + } + + /** + * 通过反射的方式获取状态栏高度 + * + * @return + */ + public static int getStatusBarHeight(Context context) { + try { + Class c = Class.forName("com.android.internal.R$dimen"); + Object obj = c.newInstance(); + Field field = c.getField("status_bar_height"); + int x = Integer.parseInt(field.get(obj).toString()); + return context.getResources().getDimensionPixelSize(x); + } catch (Exception e) { + } + return 0; + } + + /** + * 获取底部导航栏高度 + * + * @return + */ + public static int getNavigationBarHeight(Context context) { + Resources resources = context.getResources(); + int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); + //获取NavigationBar的高度 + navigationHeight = resources.getDimensionPixelSize(resourceId); + return navigationHeight; + } + + //获取是否存在NavigationBar + public static boolean checkDeviceHasNavigationBar(Context context) { + boolean hasNavigationBar = false; + Resources rs = context.getResources(); + int id = rs.getIdentifier("config_showNavigationBar", "bool", "android"); + if (id > 0) { + hasNavigationBar = rs.getBoolean(id); + } + try { + Class systemPropertiesClass = Class.forName("android.os.SystemProperties"); + Method m = systemPropertiesClass.getMethod("get", String.class); + String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys"); + if ("1".equals(navBarOverride)) { + hasNavigationBar = false; + } else if ("0".equals(navBarOverride)) { + hasNavigationBar = true; + } + } catch (Exception e) { + + } + return hasNavigationBar; + + } + + /** + * @param activity + * @param useThemestatusBarColor 是否要状态栏的颜色,不设置则为透明色 + * @param withoutUseStatusBarColor 是否不需要使用状态栏为暗色调 + */ + public static void setStatusBar(Activity activity, boolean useThemestatusBarColor, boolean withoutUseStatusBarColor) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0及以上 + View decorView = activity.getWindow().getDecorView(); + int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + decorView.setSystemUiVisibility(option); + if (useThemestatusBarColor) { + activity.getWindow().setStatusBarColor(activity.getResources().getColor(android.R.color.white)); + } else { + activity.getWindow().setStatusBarColor(Color.TRANSPARENT); + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4到5.0 + WindowManager.LayoutParams localLayoutParams = activity.getWindow().getAttributes(); + localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !withoutUseStatusBarColor) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + } + + public static void reMeasure(Activity activity) { + Display display = activity.getWindowManager().getDefaultDisplay(); + mMetrics = new DisplayMetrics(); + + if (Build.VERSION.SDK_INT >= 17) { + display.getRealMetrics(mMetrics); + } else { + display.getMetrics(mMetrics); + } + + screenWidth = mMetrics.widthPixels; + screenHeight = mMetrics.heightPixels; + } + + /** + * 改变魅族的状态栏字体为黑色,要求FlyMe4以上 + */ + private static void processFlyMe(boolean isLightStatusBar, Activity activity) { + WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); + try { + Class instance = Class.forName("android.view.WindowManager$LayoutParams"); + int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(lp); + Field field = instance.getDeclaredField("meizuFlags"); + field.setAccessible(true); + int origin = field.getInt(lp); + if (isLightStatusBar) { + field.set(lp, origin | value); + } else { + field.set(lp, (~value) & origin); + } + } catch (Exception e) { + } + } + + /** + * 改变小米的状态栏字体颜色为黑色, 要求MIUI6以上 lightStatusBar为真时表示黑色字体 + */ + private static void processMIUI(boolean lightStatusBar, Activity activity) { + Class clazz = activity.getWindow().getClass(); + try { + int darkModeFlag; + Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); + Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); + darkModeFlag = field.getInt(layoutParams); + Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); + extraFlagField.invoke(activity.getWindow(), lightStatusBar ? darkModeFlag : 0, darkModeFlag); + } catch (Exception e) { + } + } + + /** + * 设置OPPO手机状态栏字体为黑色(colorOS3.0,6.0以下部分手机) + * + * @param lightStatusBar + * @param activity + */ + private static final int SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT = 0x00000010; + + private static void setOPPOStatusTextColor(boolean lightStatusBar, Activity activity) { + Window window = activity.getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + int vis = window.getDecorView().getSystemUiVisibility(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (lightStatusBar) { + vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } else { + vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (lightStatusBar) { + vis |= SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT; + } else { + vis &= ~SYSTEM_UI_FLAG_OP_STATUS_BAR_TINT; + } + } + window.getDecorView().setSystemUiVisibility(vis); + } + + + /** + * 判断手机是否是小米 + * + * @return + */ + public static boolean isMIUI() { + return SYS_MIUI.equals(getSystem()); + } + + /** + * 判断手机是否是魅族 + * + * @return + */ + public static boolean isFlyme() { + try { + // Invoke Build.hasSmartBar() + final Method method = Build.class.getMethod("hasSmartBar"); + return method != null; + } catch (final Exception e) { + return false; + } + } + + /** + * 设置状态栏文字色值为深色调 + * + * @param useDart 是否使用深色调 + * @param activity + */ + public static void setStatusTextColor(boolean useDart, Activity activity) { + if (isFlyme()) { + processFlyMe(useDart, activity); + } else if (isMIUI()) { + processMIUI(useDart, activity); + } else if (Build.MANUFACTURER.equalsIgnoreCase("OPPO")) { + //OPPO + setOPPOStatusTextColor(useDart, activity); + } else { + if (useDart) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } + } else { + activity.getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + } + activity.getWindow().getDecorView().findViewById(android.R.id.content).setPadding(0, 0, 0, navigationHeight); + } + } + + /** + * 作者:Loyea + * 链接:https://www.jianshu.com/p/abd021c22728 + * 來源:简书 + * 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 + */ + public static void setAndroidNativeLightStatusBar(Activity activity, boolean dark) { + View decor = activity.getWindow().getDecorView(); + if (dark) { + decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + } else { + // We want to change tint color to white again. + // You can also record the flags in advance so that you can turn UI back completely if + // you have set other flags before, such as translucent or full screen. + decor.setSystemUiVisibility(0); + } + } + + public static String getSystem() { + String SYS = ""; + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { + if (!TextUtils.isEmpty(getSystemProperty(KEY_MIUI_VERSION_CODE, "")) + || !TextUtils.isEmpty(getSystemProperty(KEY_MIUI_VERSION_NAME, "")) + || !TextUtils.isEmpty(getSystemProperty(KEY_MIUI_INTERNAL_STORAGE, ""))) { + SYS = SYS_MIUI;//小米 + } else if (!TextUtils.isEmpty(getSystemProperty(KEY_EMUI_API_LEVEL, "")) + || !TextUtils.isEmpty(getSystemProperty(KEY_EMUI_VERSION, "")) + || !TextUtils.isEmpty(getSystemProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, ""))) { + SYS = SYS_EMUI;//华为 + } else if (getMeizuFlymeOSFlag().toLowerCase().contains("flyme")) { + SYS = SYS_FLYME;//魅族 + } + return SYS; + } else { + try { + Properties prop = new Properties(); + prop.load(new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"))); + if (prop.getProperty(KEY_MIUI_VERSION_CODE, null) != null + || prop.getProperty(KEY_MIUI_VERSION_NAME, null) != null + || prop.getProperty(KEY_MIUI_INTERNAL_STORAGE, null) != null) { + SYS = SYS_MIUI;//小米 + } else if (prop.getProperty(KEY_EMUI_API_LEVEL, null) != null + || prop.getProperty(KEY_EMUI_VERSION, null) != null + || prop.getProperty(KEY_EMUI_CONFIG_HW_SYS_VERSION, null) != null) { + SYS = SYS_EMUI;//华为 + } else if (getMeizuFlymeOSFlag().toLowerCase().contains("flyme")) { + SYS = SYS_FLYME;//魅族 + } + } catch (IOException e) { + e.printStackTrace(); + return SYS; + } finally { + return SYS; + } + } + } + + private static String getSystemProperty(String key, String defaultValue) { + try { + Class clz = Class.forName("android.os.SystemProperties"); + Method get = clz.getMethod("get", String.class, String.class); + return (String) get.invoke(clz, key, defaultValue); + } catch (Exception e) { + } + return defaultValue; + } + + public static String getMeizuFlymeOSFlag() { + return getSystemProperty("ro.build.display.id", ""); + } + + /** + * 全屏模式下 针对刘海屏向下移动view + * + * @param context + * @param view 需要设置padding的view + */ + public static void setStatusBarPadding(Context context, View view) { + if (view != null) { + view.setPadding(0, getStatusBarHeight(context), 0, 0); + } + } +} diff --git a/app/src/main/res/layout-sw700dp/activity_add_contact.xml b/app/src/main/res/layout-sw700dp/activity_add_contact.xml new file mode 100644 index 0000000..239913d --- /dev/null +++ b/app/src/main/res/layout-sw700dp/activity_add_contact.xml @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/activity_main.xml b/app/src/main/res/layout-sw700dp/activity_main.xml new file mode 100644 index 0000000..9ed1ded --- /dev/null +++ b/app/src/main/res/layout-sw700dp/activity_main.xml @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/activity_setting.xml b/app/src/main/res/layout-sw700dp/activity_setting.xml new file mode 100644 index 0000000..d30f440 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/activity_setting.xml @@ -0,0 +1,646 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/activity_sim_card.xml b/app/src/main/res/layout-sw700dp/activity_sim_card.xml new file mode 100644 index 0000000..76a4640 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/activity_sim_card.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/activity_touch.xml b/app/src/main/res/layout-sw700dp/activity_touch.xml new file mode 100644 index 0000000..5311dd0 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/activity_touch.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/fragment_applist.xml b/app/src/main/res/layout-sw700dp/fragment_applist.xml new file mode 100644 index 0000000..bb34016 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/fragment_applist.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/fragment_contact_home.xml b/app/src/main/res/layout-sw700dp/fragment_contact_home.xml new file mode 100644 index 0000000..d4f244b --- /dev/null +++ b/app/src/main/res/layout-sw700dp/fragment_contact_home.xml @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/fragment_home.xml b/app/src/main/res/layout-sw700dp/fragment_home.xml new file mode 100644 index 0000000..c1c5c0d --- /dev/null +++ b/app/src/main/res/layout-sw700dp/fragment_home.xml @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/fragment_settings.xml b/app/src/main/res/layout-sw700dp/fragment_settings.xml new file mode 100644 index 0000000..4f76c34 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/fragment_settings.xml @@ -0,0 +1,482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/item_actions.xml b/app/src/main/res/layout-sw700dp/item_actions.xml new file mode 100644 index 0000000..e8aead5 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/item_actions.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/item_contact_wechat.xml b/app/src/main/res/layout-sw700dp/item_contact_wechat.xml new file mode 100644 index 0000000..25bc06e --- /dev/null +++ b/app/src/main/res/layout-sw700dp/item_contact_wechat.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-sw700dp/item_dock_app.xml b/app/src/main/res/layout-sw700dp/item_dock_app.xml new file mode 100644 index 0000000..3f219e5 --- /dev/null +++ b/app/src/main/res/layout-sw700dp/item_dock_app.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_contact.xml b/app/src/main/res/layout/activity_add_contact.xml index 5d41b36..d8d2058 100644 --- a/app/src/main/res/layout/activity_add_contact.xml +++ b/app/src/main/res/layout/activity_add_contact.xml @@ -56,8 +56,7 @@ android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@+id/cl_bottom" - app:layout_constraintTop_toBottomOf="@+id/cl_exit" - tools:layout_editor_absoluteX="16dp"> + app:layout_constraintTop_toBottomOf="@+id/cl_exit"> + android:background="@drawable/add_wechat_contact_background" + android:visibility="gone"> + app:layout_constraintBottom_toBottomOf="parent"> - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notice_info.xml b/app/src/main/res/layout/activity_notice_info.xml index 2f27b3e..42458cc 100644 --- a/app/src/main/res/layout/activity_notice_info.xml +++ b/app/src/main/res/layout/activity_notice_info.xml @@ -18,8 +18,7 @@ android:layout_height="52dp" android:layout_margin="8dp" android:background="@drawable/bt_alarm_bg" - app:layout_constraintTop_toTopOf="parent" - tools:layout_editor_absoluteX="8dp"> + app:layout_constraintTop_toTopOf="parent"> + xmlns:tools="http://schemas.android.com/tools" + tools:context=".activity.screenlock.ScreenLockActivity"> @@ -44,8 +44,7 @@ android:layout_height="wrap_content" app:layout_constraintBottom_toTopOf="@+id/ll_keyboard" app:layout_constraintTop_toBottomOf="@+id/imageView5" - app:layout_constraintVertical_bias="0.347" - tools:layout_editor_absoluteX="0dp"> + app:layout_constraintVertical_bias="0.347"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:visibility="@{systemSettings.desktop_location==1?View.VISIBLE:View.INVISIBLE}" + tools:visibility="visible"> + app:layout_constraintTop_toTopOf="parent" + tools:visibility="gone" /> diff --git a/app/src/main/res/raw/time_am1.mp3 b/app/src/main/res/raw/time_am1.mp3 new file mode 100644 index 0000000..788677e Binary files /dev/null and b/app/src/main/res/raw/time_am1.mp3 differ diff --git a/app/src/main/res/raw/time_am10.mp3 b/app/src/main/res/raw/time_am10.mp3 new file mode 100644 index 0000000..3ceeb66 Binary files /dev/null and b/app/src/main/res/raw/time_am10.mp3 differ diff --git a/app/src/main/res/raw/time_am11.mp3 b/app/src/main/res/raw/time_am11.mp3 new file mode 100644 index 0000000..dad910e Binary files /dev/null and b/app/src/main/res/raw/time_am11.mp3 differ diff --git a/app/src/main/res/raw/time_am12.mp3 b/app/src/main/res/raw/time_am12.mp3 new file mode 100644 index 0000000..2921cf8 Binary files /dev/null and b/app/src/main/res/raw/time_am12.mp3 differ diff --git a/app/src/main/res/raw/time_am2.mp3 b/app/src/main/res/raw/time_am2.mp3 new file mode 100644 index 0000000..0d05bb9 Binary files /dev/null and b/app/src/main/res/raw/time_am2.mp3 differ diff --git a/app/src/main/res/raw/time_am3.mp3 b/app/src/main/res/raw/time_am3.mp3 new file mode 100644 index 0000000..9ce9290 Binary files /dev/null and b/app/src/main/res/raw/time_am3.mp3 differ diff --git a/app/src/main/res/raw/time_am4.mp3 b/app/src/main/res/raw/time_am4.mp3 new file mode 100644 index 0000000..b7f7086 Binary files /dev/null and b/app/src/main/res/raw/time_am4.mp3 differ diff --git a/app/src/main/res/raw/time_am5.mp3 b/app/src/main/res/raw/time_am5.mp3 new file mode 100644 index 0000000..7f97bd8 Binary files /dev/null and b/app/src/main/res/raw/time_am5.mp3 differ diff --git a/app/src/main/res/raw/time_am6.mp3 b/app/src/main/res/raw/time_am6.mp3 new file mode 100644 index 0000000..a553399 Binary files /dev/null and b/app/src/main/res/raw/time_am6.mp3 differ diff --git a/app/src/main/res/raw/time_am7.mp3 b/app/src/main/res/raw/time_am7.mp3 new file mode 100644 index 0000000..a346a60 Binary files /dev/null and b/app/src/main/res/raw/time_am7.mp3 differ diff --git a/app/src/main/res/raw/time_am8.mp3 b/app/src/main/res/raw/time_am8.mp3 new file mode 100644 index 0000000..230385d Binary files /dev/null and b/app/src/main/res/raw/time_am8.mp3 differ diff --git a/app/src/main/res/raw/time_am9.mp3 b/app/src/main/res/raw/time_am9.mp3 new file mode 100644 index 0000000..6d6d5c7 Binary files /dev/null and b/app/src/main/res/raw/time_am9.mp3 differ diff --git a/app/src/main/res/raw/time_pm1.mp3 b/app/src/main/res/raw/time_pm1.mp3 new file mode 100644 index 0000000..8b1c6f0 Binary files /dev/null and b/app/src/main/res/raw/time_pm1.mp3 differ diff --git a/app/src/main/res/raw/time_pm10.mp3 b/app/src/main/res/raw/time_pm10.mp3 new file mode 100644 index 0000000..3987241 Binary files /dev/null and b/app/src/main/res/raw/time_pm10.mp3 differ diff --git a/app/src/main/res/raw/time_pm11.mp3 b/app/src/main/res/raw/time_pm11.mp3 new file mode 100644 index 0000000..8aa7c9f Binary files /dev/null and b/app/src/main/res/raw/time_pm11.mp3 differ diff --git a/app/src/main/res/raw/time_pm12.mp3 b/app/src/main/res/raw/time_pm12.mp3 new file mode 100644 index 0000000..a7a6fe0 Binary files /dev/null and b/app/src/main/res/raw/time_pm12.mp3 differ diff --git a/app/src/main/res/raw/time_pm2.mp3 b/app/src/main/res/raw/time_pm2.mp3 new file mode 100644 index 0000000..d3d7585 Binary files /dev/null and b/app/src/main/res/raw/time_pm2.mp3 differ diff --git a/app/src/main/res/raw/time_pm3.mp3 b/app/src/main/res/raw/time_pm3.mp3 new file mode 100644 index 0000000..560b588 Binary files /dev/null and b/app/src/main/res/raw/time_pm3.mp3 differ diff --git a/app/src/main/res/raw/time_pm4.mp3 b/app/src/main/res/raw/time_pm4.mp3 new file mode 100644 index 0000000..3607d40 Binary files /dev/null and b/app/src/main/res/raw/time_pm4.mp3 differ diff --git a/app/src/main/res/raw/time_pm5.mp3 b/app/src/main/res/raw/time_pm5.mp3 new file mode 100644 index 0000000..93a819a Binary files /dev/null and b/app/src/main/res/raw/time_pm5.mp3 differ diff --git a/app/src/main/res/raw/time_pm6.mp3 b/app/src/main/res/raw/time_pm6.mp3 new file mode 100644 index 0000000..32ea529 Binary files /dev/null and b/app/src/main/res/raw/time_pm6.mp3 differ diff --git a/app/src/main/res/raw/time_pm7.mp3 b/app/src/main/res/raw/time_pm7.mp3 new file mode 100644 index 0000000..8a58c92 Binary files /dev/null and b/app/src/main/res/raw/time_pm7.mp3 differ diff --git a/app/src/main/res/raw/time_pm8.mp3 b/app/src/main/res/raw/time_pm8.mp3 new file mode 100644 index 0000000..0306666 Binary files /dev/null and b/app/src/main/res/raw/time_pm8.mp3 differ diff --git a/app/src/main/res/raw/time_pm9.mp3 b/app/src/main/res/raw/time_pm9.mp3 new file mode 100644 index 0000000..b7d5ab0 Binary files /dev/null and b/app/src/main/res/raw/time_pm9.mp3 differ