diff --git a/app/build.gradle b/app/build.gradle index f2862bb..b67ed03 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.uiui.os" minSdkVersion 24 targetSdkVersion 29 - versionCode 2 - versionName "1.1" + versionCode 4 + versionName "1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -133,7 +133,8 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) +// implementation fileTree(dir: 'libs', include: ['*.jar']) + compileOnly files('libs/framework.jar') implementation files('libs/QWeather_Public_Android_V4.6.jar') implementation 'androidx.appcompat:appcompat:1.3.1' @@ -184,3 +185,23 @@ dependencies { implementation 'com.arialyy.aria:core:3.8.15' annotationProcessor 'com.arialyy.aria:compiler:3.8.15' } + +preBuild { + doLast { + def imlFile = file(project.name + ".iml") +// def imlFile = file("..\\.idea\\modules\\" + project.name + "\\" + rootProject.name + "." + project.name + ".iml") + println 'Change ' + project.name + '.iml order' + try { + def parsedXml = (new XmlParser()).parse(imlFile) + def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' } + parsedXml.component[1].remove(jdkNode) + def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform" + println 'what' + sdkString + new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK']) + groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile)) + } catch (FileNotFoundException e) { + // nop, iml not found + println "no iml found" + } + } +} diff --git a/app/libs/framework.jar b/app/libs/framework.jar new file mode 100644 index 0000000..fefe7ec Binary files /dev/null and b/app/libs/framework.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f46e691..aefb5bf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ package="com.uiui.os" android:sharedUserId="android.uid.system"> + + @@ -21,6 +23,7 @@ + - + + android:theme="@style/activity_styles" /> + android:exported="true"> + + + + + + + + phoneListSet; + + @Override + protected void onCreate(Bundle savedInstanceState) { + Log.e(TAG, "onCreate: "); + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_emergency); + ButterKnife.bind(this); + Intent intent = getIntent(); +// String setting_sos = intent.getStringExtra("setting_sos"); +// if (TextUtils.isEmpty(setting_sos)) { +// finish(); +// return; +// } + + String setting_sos = Settings.System.getString(getContentResolver(), "setting_sos"); + if (TextUtils.isEmpty(setting_sos)) return; + phoneListSet = new ArrayList<>(Arrays.asList(setting_sos.split(","))); + Log.e(TAG, "onCreate: " + phoneListSet); + + final Long time = 3L; + subscribe = Observable.interval(1, TimeUnit.SECONDS) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> { + Log.e("TAG", "倒计时:" + aLong); + if (aLong < time && !subscribe.isDisposed()) { + tv_countdown.setText("倒计时(" + (time - aLong - 1) + ")秒"); + Log.e(TAG, "accept: " + (time - aLong - 1)); + } else { + NetInterfaceManager.getInstance() + .getSOSRecordObservable() + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("SOSRecord", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + Log.e("SOSRecord", "onNext: " + baseResponse); + + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("SOSRecord", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("SOSRecord", "onComplete: "); + } + }); + needDial = true; + Intent intent1 = new Intent(Intent.ACTION_CALL); + Uri data = Uri.parse("tel:" + phoneListSet.get(0)); + intent1.setData(data); + startActivity(intent1); + isCalling = true; + phoneListSet.remove(0); +// finish(); + subscribe.dispose(); + } + }); + iv_finish.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); +// TelephonyManager telM = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); +// telM.listen(new PhoneStateListener() { +// /** +// * 当有精确通话状态时回调 +// * Callback invoked when precise device call state changes +// * @hide 隐藏api, 给系统app使用的 +// */ +// public void onPreciseCallStateChanged(PreciseCallState callState) { +// //当有精确通话状态时回调 +// Log.e(TAG, "onPreciseCallStateChanged: " + callState); +// } +// }, PhoneStateListener.LISTEN_PRECISE_CALL_STATE); //需要权限android.permission.READ_PRECISE_PHONE_STATE +// +// StatusBarManager mStatusBarManager = (StatusBarManager) getApplicationContext().getSystemService(Context.STATUS_BAR_SERVICE); +//// mStatusBarManager.disable(StatusBarManager.DISABLE_HOME);//隐藏home键 + } + + @Override + protected void onStart() { + super.onStart(); + Log.e(TAG, "onResume: "); + Log.e(TAG, "onResume: " + phoneListSet); + if (needDial) { + if (phoneListSet == null || phoneListSet.size() == 0) return; + Handler.getMain().postDelayed(new Runnable() { + @Override + public void run() { + Intent intent1 = new Intent(Intent.ACTION_CALL); + Uri data = Uri.parse("tel:" + phoneListSet.get(0)); + intent1.setData(data); + startActivity(intent1); + isCalling = true; + phoneListSet.remove(0); + } + }, 2000); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + Log.e(TAG, "onDestroy: "); + if (subscribe != null) { + subscribe.dispose(); + subscribe = null; + } + } + + // class MobileCallReceiver extends BroadcastReceiver { +// @Override +// public void onReceive(Context context, Intent intent) { +// if (intent.getAction() == null) { +// return; +// } +//// switch (intent.getAction()) { +//// case CustomAction.PRECISE_CALL_STATE: +//// int callState = intent.getIntExtra("foreground_state", -2); +//// switch (callState) { +//// case PreciseCallState.PRECISE_CALL_STATE_IDLE: +//// Log.d(TAG, "IDLE"); +//// break; +//// case PreciseCallState.PRECISE_CALL_STATE_DIALING: +//// Log.d(TAG, "DIALING"); +//// break; +//// case PreciseCallState.PRECISE_CALL_STATE_ALERTING: +//// Log.d(TAG, "ALERTING isHandFree=" + isHandFree); +//// break; +//// case PreciseCallState.PRECISE_CALL_STATE_ACTIVE: +//// Log.d(TAG, "ACTIVE"); +//// break; +//// case PreciseCallState.PRECISE_CALL_STATE_INCOMING: +//// Log.d(TAG, "INCOMING来电"); +//// break; +//// case PreciseCallState.PRECISE_CALL_STATE_DISCONNECTING: +//// Log.d(TAG, "DISCONNECTING"); +//// break; +//// case PreciseCallState.PRECISE_CALL_STATE_DISCONNECTED: +//// Log.d(TAG, "DISCONNECTED"); +//// break; +//// } +//// break; +//// case TelephonyManager.ACTION_PHONE_STATE_CHANGED: +//// break; +//// } +// } +// } +// +// // 精确的九大通话状态 +// public class PreciseCallState { +// public static final int PRECISE_CALL_STATE_IDLE = 0; //通话空闲 +// public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通话(活动中) +// public static final int PRECISE_CALL_STATE_HOLDING = 2; //通话挂起(例如我和多个人通话,其中一个通话在活动,而其它通话就会进入挂起状态) +// public static final int PRECISE_CALL_STATE_DIALING = 3; //拨号开始 +// public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出(提醒对方接电话) +// public static final int PRECISE_CALL_STATE_INCOMING = 5; //对方来电 +// public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方来电等待(例如我正在和某人通话,而其他人打入时就会就进入等待状态) +// public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //挂断完成 +// public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在挂断 +// } +} diff --git a/app/src/main/java/com/uiui/os/activity/MainActivity.java b/app/src/main/java/com/uiui/os/activity/MainActivity.java index 7efbb59..7af49bf 100644 --- a/app/src/main/java/com/uiui/os/activity/MainActivity.java +++ b/app/src/main/java/com/uiui/os/activity/MainActivity.java @@ -7,14 +7,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Color; import android.os.IBinder; import android.os.RemoteException; import android.text.TextUtils; -import android.text.format.DateUtils; import android.util.Log; import android.view.KeyEvent; @@ -26,7 +24,9 @@ import androidx.viewpager.widget.ViewPager; import com.alarmclock.uiui.IAlarmAidlInterface; import com.google.gson.Gson; +import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; +import com.uiui.os.BuildConfig; import com.uiui.os.R; import com.uiui.os.base.BaseActivity; import com.uiui.os.bean.AlarmItem; @@ -35,8 +35,9 @@ import com.uiui.os.fragment.AppListFragment; import com.uiui.os.fragment.BaseFragmentPagerAdapter; import com.uiui.os.fragment.CustomFragment; import com.uiui.os.network.NetInterfaceManager; +import com.uiui.os.service.MainService; import com.uiui.os.utils.APKUtils; -import com.uiui.os.utils.TimeUtils; +import com.uiui.os.utils.AppUsedTimeUtils; import com.uiui.os.utils.Utils; import com.uiui.os.view.ScaleCircleNavigator; @@ -106,7 +107,7 @@ public class MainActivity extends BaseActivity { try { String json = mIAlarmAidlInterface.getAlarm(); Log.e(TAG, "onServiceConnected: " + json); - if (json.equalsIgnoreCase("暂无闹钟")) { + if ("暂无闹钟".equalsIgnoreCase(json) || TextUtils.isEmpty(json)) { customFragment.setAlarmItem(null); return; } @@ -140,6 +141,7 @@ public class MainActivity extends BaseActivity { @Override public void initData() { registmNewAppReceiver(); + registerSOSNumberReceiver(); fragments.add(customFragment); ArrayList applicationInfoList = APKUtils.queryFilterAppInfo(this); int x = 0; @@ -239,63 +241,108 @@ public class MainActivity extends BaseActivity { } } - private NewAppReceiver mNewAppReceiver; + @Override + protected void onStart() { + super.onStart(); + AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); + AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); + getAlarmData(); + } @Override protected void onResume() { super.onResume(); - String packagename = TimeUtils.getInstance().getAppPackageName(); - Log.e("SendcloseApp", "packagename=" + packagename); - TimeUtils.getInstance().setEndTime(System.currentTimeMillis()); - if (packagename != null && packagename.length() > 0) { - ApplicationInfo app = APKUtils.getApplicationInfo(this, packagename); - PackageManager pm = getPackageManager(); - if (app != null) { - Log.e(TAG, "onResume: " + app.loadLabel(pm).toString()); - Log.e(TAG, "onResume: " + app.packageName); - NetInterfaceManager.getInstance().getAppUsageRecordControl() - .sendappUsageRecord(Utils.getSerial(), - app.loadLabel(pm).toString(), app.packageName, - TimeUtils.getInstance().getStartTime() / 1000, - TimeUtils.getInstance().getEndTime() / 1000) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - Log.e("onResume", "onSubscribe: "); - } - - @Override - public void onNext(BaseResponse baseResponse) { - Log.e("onResume", "onNext: " + baseResponse); - } - - @Override - public void onError(Throwable e) { - Log.e("onResume", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e("onResume", "onComplete: "); - } - }); - TimeUtils.getInstance().setAppPackageName(""); - } else { - Log.e("fht", "app = null" + packagename); - } - } - getAlarmData(); - + SendRunningApp(MainActivity.this); } + private void SendRunningApp(Context context) { + AppUsedTimeUtils.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); + AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); + long time = AppUsedTimeUtils.getInstance().getStartTime(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("app_package", BuildConfig.APPLICATION_ID); + jsonObject.addProperty("version_name", APKUtils.getAPPVersionName(context, BuildConfig.APPLICATION_ID)); + jsonObject.addProperty("start_time", time / 1000); + String jsonString = jsonObject.toString(); + Log.e(TAG, "SendRunningApp: " + jsonString); + NetInterfaceManager.getInstance() + .getRunningAppObservable(jsonString) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("SendRunningApp", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("SendRunningApp", "onSubscribe: " + baseResponse); + } + + @Override + public void onError(Throwable e) { + Log.e("SendRunningApp", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("SendRunningApp", "onComplete: "); + } + }); + } + + @Override protected void onRestart() { super.onRestart(); + AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); + String packagename = AppUsedTimeUtils.getInstance().getAppPackageName(); + Log.e(TAG, "onRestart packagename == " + packagename); + if (!TextUtils.isEmpty(packagename)) { + Log.e(TAG, "onRestart: " + APKUtils.getAppNameByPackage(MainActivity.this, packagename)); + Log.e(TAG, "onRestart: " + packagename); + NetInterfaceManager.getInstance().getAppUsageRecordControl() + .sendappUsageRecord(Utils.getSerial(), + APKUtils.getAppNameByPackage(MainActivity.this, packagename), + packagename, + AppUsedTimeUtils.getInstance().getStartTime() / 1000, + AppUsedTimeUtils.getInstance().getEndTime() / 1000) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendappUsageRecord", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("sendappUsageRecord", "onNext: " + baseResponse); + } + + @Override + public void onError(Throwable e) { + Log.e("sendappUsageRecord", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("sendappUsageRecord", "onComplete: "); + } + }); + } else { + Log.e("onRestart", "app = null" + packagename); + } + } + + @Override + protected void onPause() { + super.onPause(); } @Override protected void onStop() { super.onStop(); + AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); } private void registmNewAppReceiver() { @@ -309,6 +356,8 @@ public class MainActivity extends BaseActivity { registerReceiver(mNewAppReceiver, filter); } + private NewAppReceiver mNewAppReceiver; + class NewAppReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { @@ -320,4 +369,26 @@ public class MainActivity extends BaseActivity { } } } + + private SOSNumberReceiver sosNumberReceiver; + + private void registerSOSNumberReceiver() { + if (sosNumberReceiver == null) { + sosNumberReceiver = new SOSNumberReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction("setting_sos"); + registerReceiver(sosNumberReceiver, filter); + } + + class SOSNumberReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.e(TAG, "onReceive: " + intent.getAction()); + String setting_sos = intent.getStringExtra("setting_sos"); + if (TextUtils.isEmpty(setting_sos)) return; + customFragment.setSosNumber(); + } + } } diff --git a/app/src/main/java/com/uiui/os/adapter/SOSNnmberAdapter.java b/app/src/main/java/com/uiui/os/adapter/SOSNnmberAdapter.java new file mode 100644 index 0000000..fe23b1d --- /dev/null +++ b/app/src/main/java/com/uiui/os/adapter/SOSNnmberAdapter.java @@ -0,0 +1,67 @@ +package com.uiui.os.adapter; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.RecyclerView; + +import com.uiui.os.R; +import com.uiui.os.activity.EmergencyActivity; +import com.uiui.os.bean.AlarmItem; + +import java.util.List; + +public class SOSNnmberAdapter extends RecyclerView.Adapter { + private List phoneNumberList; + private Context mContext; + + public void setPhoneNumberList(List phoneList) { + this.phoneNumberList = phoneList; + notifyDataSetChanged(); + } + + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + mContext = parent.getContext(); + return new SOSNnmberAdapter.ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sosnumber, parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + String phone = phoneNumberList.get(position); + holder.tv_number.setText(phone); + holder.root.setOnClickListener(v -> { + Intent intent = new Intent(mContext, EmergencyActivity.class); + intent.putExtra("setting_sos", phone); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(intent); + + }); + } + + @Override + public int getItemCount() { + return phoneNumberList == null ? 0 : phoneNumberList.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView tv_number; + TextView tv_dial; + ConstraintLayout root; + + ViewHolder(@NonNull View itemView) { + super(itemView); + tv_number = itemView.findViewById(R.id.tv_number); + tv_dial = itemView.findViewById(R.id.tv_dial); + root = itemView.findViewById(R.id.root); + } + } +} diff --git a/app/src/main/java/com/uiui/os/base/BaseApplication.java b/app/src/main/java/com/uiui/os/base/BaseApplication.java index 8cee691..62863ad 100644 --- a/app/src/main/java/com/uiui/os/base/BaseApplication.java +++ b/app/src/main/java/com/uiui/os/base/BaseApplication.java @@ -16,7 +16,7 @@ import com.uiui.os.network.NetInterfaceManager; import com.uiui.os.service.MainService; import com.uiui.os.utils.AlarmUtils; import com.uiui.os.utils.AmapManager; -import com.uiui.os.utils.TimeUtils; +import com.uiui.os.utils.AppUsedTimeUtils; public class BaseApplication extends Application { @@ -51,7 +51,7 @@ public class BaseApplication extends Application { Aria.init(this); Aria.get(this).getDownloadConfig().setMaxTaskNum(1); Aria.get(this).getDownloadConfig().setConvertSpeed(true); - TimeUtils.init(this); + AppUsedTimeUtils.init(this); AlarmUtils.init(this); HeConfig.init("HE2111041506381545", "32b5ec69545e44119583a5e0ed4e87df"); AmapManager.init(this); diff --git a/app/src/main/java/com/uiui/os/fragment/AppListFragment.java b/app/src/main/java/com/uiui/os/fragment/AppListFragment.java index 4d7cc13..900ab69 100644 --- a/app/src/main/java/com/uiui/os/fragment/AppListFragment.java +++ b/app/src/main/java/com/uiui/os/fragment/AppListFragment.java @@ -24,7 +24,7 @@ import com.uiui.os.network.NetInterfaceManager; import com.uiui.os.utils.APKUtils; import com.uiui.os.utils.BitmapUtils; import com.uiui.os.utils.IconUtils; -import com.uiui.os.utils.TimeUtils; +import com.uiui.os.utils.AppUsedTimeUtils; import com.uiui.os.view.MyGridLayout; import java.util.ArrayList; @@ -125,6 +125,7 @@ public class AppListFragment extends Fragment { String val = IconUtils.appIconList.get(i); int resID = getActivity().getResources().getIdentifier(val, "drawable", "com.uiui.os"); if (resID == 0) { + Log.e(TAG, "getView: not found src : " + applicationInfo.packageName); iv.setImageDrawable(applicationInfo.loadIcon(pm)); } else { iv.setImageDrawable(getActivity().getResources().getDrawable(resID)); @@ -154,8 +155,8 @@ public class AppListFragment extends Fragment { ApplicationInfo applicationInfo = applicationInfos.get(index); if (applicationInfo != null) { APKUtils.openPackage(v.getContext(), applicationInfo.packageName); - TimeUtils.getInstance().setAppPackageName(applicationInfo.packageName); - TimeUtils.getInstance().setStartTime(System.currentTimeMillis()); + AppUsedTimeUtils.getInstance().setAppPackageName(applicationInfo.packageName); + AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); SendRunningApp(getActivity()); } } @@ -163,8 +164,8 @@ public class AppListFragment extends Fragment { } private void SendRunningApp(Context context) { - String packageName = TimeUtils.getInstance().getAppPackageName(); - long time = TimeUtils.getInstance().getStartTime(); + String packageName = AppUsedTimeUtils.getInstance().getAppPackageName(); + long time = AppUsedTimeUtils.getInstance().getStartTime(); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("app_package", packageName); jsonObject.addProperty("version_name", APKUtils.getAPPVersionName(context, packageName)); diff --git a/app/src/main/java/com/uiui/os/fragment/CustomFragment.java b/app/src/main/java/com/uiui/os/fragment/CustomFragment.java index bddc6c7..659468d 100644 --- a/app/src/main/java/com/uiui/os/fragment/CustomFragment.java +++ b/app/src/main/java/com/uiui/os/fragment/CustomFragment.java @@ -2,6 +2,7 @@ package com.uiui.os.fragment; import android.app.ActivityManager; import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -41,10 +42,14 @@ import com.qweather.sdk.view.QWeather; import com.tencent.mmkv.MMKV; import com.uiui.os.BuildConfig; import com.uiui.os.R; +import com.uiui.os.activity.EmergencyActivity; import com.uiui.os.adapter.AlarmClockAdapter; import com.uiui.os.adapter.NotificationAdapter; +import com.uiui.os.adapter.SOSNnmberAdapter; import com.uiui.os.bean.AlarmClockData; import com.uiui.os.bean.AlarmItem; +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.network.NetInterfaceManager; import com.uiui.os.utils.AmapManager; import com.uiui.os.utils.APKUtils; import com.uiui.os.utils.AppUtil; @@ -52,10 +57,15 @@ import com.uiui.os.utils.Utils; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; +import io.reactivex.rxjava3.annotations.NonNull; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; /** @@ -88,6 +98,15 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt TextView wifi_ssid; @BindView(R.id.cl_wifi) ConstraintLayout cl_wifi; + @BindView(R.id.iv_sos) + ImageView iv_sos; + @BindView(R.id.rv_sos) + RecyclerView rv_sos; + @BindView(R.id.cl_sos) + ConstraintLayout cl_soso; + @BindView(R.id.iv_note_nodata) + ImageView iv_note_nodata; + private String TAG = CustomFragment.class.getSimpleName(); private int[] mShaderColors = new int[]{0xFFfa3db5, 0xFFF8867E, 0xFFF79F6B, 0xFFF79F6B, 0xFFF79F6B, 0xFFF8867E, 0xFFfa3db5}; @@ -95,7 +114,10 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt private List alarmItemList; private NotificationAdapter notificationAdapter; private AlarmClockAdapter alarmClockAdapter; + private SOSNnmberAdapter sosNnmberAdapter; private MMKV mmkv; + private Context context; + private ContentResolver mCRv; // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -227,11 +249,11 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt int status = intent.getIntExtra("status", BatteryManager.BATTERY_STATUS_UNKNOWN); if (status == BatteryManager.BATTERY_STATUS_CHARGING) { if (rootView != null) { - iv_charging.setVisibility(View.VISIBLE); +// iv_charging.setVisibility(View.VISIBLE); } } else { if (rootView != null) { - iv_charging.setVisibility(View.GONE); +// iv_charging.setVisibility(View.GONE); } } } @@ -243,6 +265,8 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt Bundle savedInstanceState) { // Inflate the layout for this fragment rootView = inflater.inflate(R.layout.fragment_custom, container, false); + context = rootView.getContext(); + mCRv = context.getContentResolver(); ButterKnife.bind(this, rootView); initView(); initData(); @@ -281,10 +305,42 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt alarmClockAdapter = new AlarmClockAdapter(); rv_clock.setLayoutManager(new LinearLayoutManager(getActivity())); rv_clock.setAdapter(alarmClockAdapter); + sosNnmberAdapter = new SOSNnmberAdapter(); + rv_sos.setLayoutManager(new LinearLayoutManager(getActivity())); + rv_sos.setAdapter(sosNnmberAdapter); + cl_soso.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getActivity(), EmergencyActivity.class); +// intent.putExtra("setting_sos", phone); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + getActivity().startActivity(intent); + } + }); setAlarm(); refreshMemory(); } + @Override + public void onResume() { + super.onResume(); + setAlarm(); + setSosNumber(); + } + + public void setSosNumber() { + String setting_sos = Settings.System.getString(mCRv, "setting_sos"); + if (TextUtils.isEmpty(setting_sos)) { +// rv_sos.setVisibility(View.GONE); +// iv_sos.setVisibility(View.VISIBLE); + } else { +// rv_sos.setVisibility(View.VISIBLE); +// iv_sos.setVisibility(View.GONE); + List phoneList = new ArrayList<>(Arrays.asList(setting_sos.split(","))); + sosNnmberAdapter.setPhoneNumberList(phoneList); + } + } + private void setAlarm() { if (rootView == null) return; if (alarmItemList == null) { @@ -328,7 +384,13 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt }.getType(); Gson gson = new Gson(); List data = gson.fromJson(jsonString, type); + List showData = data.subList(0, 1); notificationAdapter.setDataList(data); + recyclerView.setVisibility(View.VISIBLE); + iv_note_nodata.setVisibility(View.GONE); + } else { + recyclerView.setVisibility(View.GONE); + iv_note_nodata.setVisibility(View.VISIBLE); } } @@ -369,7 +431,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt private void killBackgroundApp() { - List pkgList = APKUtils.queryFilterAppList(getActivity()); + List pkgList = APKUtils.queryFilterAppList(context); for (String pkg : pkgList) { if (pkg.equalsIgnoreCase(BuildConfig.APPLICATION_ID)) continue; killBackgroundProcesses(pkg); @@ -380,7 +442,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt ActivityManager activityManager; try { activityManager = (ActivityManager) - getActivity().getSystemService(Context.ACTIVITY_SERVICE); + context.getSystemService(Context.ACTIVITY_SERVICE); activityManager.killBackgroundProcesses(packageName); Method forceStopPackage = activityManager.getClass() .getDeclaredMethod("forceStopPackage", String.class); @@ -395,8 +457,8 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt } private void refreshMemory() { - long avail = AppUtil.getAvailMemory(getActivity()); - long total = AppUtil.getTotalMemory(getActivity()); + long avail = AppUtil.getAvailMemory(context); + long total = AppUtil.getTotalMemory(context); int x = (int) (((total - avail) / (double) total) * 100); cpv.setProgressColor(mShaderColors); cpv.showAnimation(0, x, 1000); diff --git a/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java index 7372d54..817a8eb 100644 --- a/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/os/network/NetInterfaceManager.java @@ -9,6 +9,7 @@ import com.uiui.os.bean.BaseResponse; import com.uiui.os.network.api.AlarmClockApi; import com.uiui.os.network.api.AppUsageRecordApi; import com.uiui.os.network.api.RunNewApp; +import com.uiui.os.network.api.SOSRecord; import com.uiui.os.network.api.SendScreenshotApi; import com.uiui.os.utils.MD5Util; import com.uiui.os.utils.Utils; @@ -168,6 +169,13 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable getSOSRecordObservable() { + return mRetrofit.create(SOSRecord.class) + .sendSOSRecord(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + public AppUsageRecordApi getAppUsageRecordControl() { return mRetrofit.create(AppUsageRecordApi.class); } diff --git a/app/src/main/java/com/uiui/os/network/URLAddress.java b/app/src/main/java/com/uiui/os/network/URLAddress.java index d8fa067..446884c 100644 --- a/app/src/main/java/com/uiui/os/network/URLAddress.java +++ b/app/src/main/java/com/uiui/os/network/URLAddress.java @@ -10,4 +10,7 @@ public class URLAddress { public static final String RUN_NEW_APP = "app/runNewApp"; //上传截图 public static final String SEND_SCREENSHOT = "sn/uploadScreenshot"; + //sos记录 + public static final String SOS_RECORD = "sosRecord"; + } diff --git a/app/src/main/java/com/uiui/os/network/api/SOSRecord.java b/app/src/main/java/com/uiui/os/network/api/SOSRecord.java new file mode 100644 index 0000000..bbec2a7 --- /dev/null +++ b/app/src/main/java/com/uiui/os/network/api/SOSRecord.java @@ -0,0 +1,17 @@ +package com.uiui.os.network.api; + +import com.uiui.os.bean.BaseResponse; +import com.uiui.os.network.URLAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface SOSRecord { + @FormUrlEncoded + @POST(URLAddress.SOS_RECORD) + Observable sendSOSRecord( + @Field("sn") String sn + ); +} diff --git a/app/src/main/java/com/uiui/os/service/MainService.java b/app/src/main/java/com/uiui/os/service/MainService.java index 3917ae1..fbbe5ea 100644 --- a/app/src/main/java/com/uiui/os/service/MainService.java +++ b/app/src/main/java/com/uiui/os/service/MainService.java @@ -4,6 +4,8 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.IBinder; @@ -17,6 +19,7 @@ import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.task.DownloadTask; import com.blankj.utilcode.util.ImageUtils; import com.blankj.utilcode.util.NetworkUtils; +import com.uiui.os.BuildConfig; import com.uiui.os.activity.MainContact; import com.uiui.os.activity.MainPresenter; import com.uiui.os.activity.NoticeActivity; @@ -24,9 +27,10 @@ import com.uiui.os.base.BaseService; import com.uiui.os.bean.AlarmClockData; import com.uiui.os.bean.BaseResponse; import com.uiui.os.network.NetInterfaceManager; +import com.uiui.os.utils.APKUtils; import com.uiui.os.utils.CmdUtil; import com.uiui.os.utils.ForegroundAppUtil; -import com.uiui.os.utils.TimeUtils; +import com.uiui.os.utils.AppUsedTimeUtils; import com.uiui.os.utils.ToastUtil; import com.uiui.os.utils.Utils; @@ -36,9 +40,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; -import java.util.HashMap; import java.util.List; -import java.util.Map; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; @@ -92,6 +94,7 @@ public class MainService extends BaseService implements MainContact.MainView, Ne mPresenter.getAlarmClock(); registerAlarmReceiver(); registerTimeReceiver(); + registerLockScreenReceiver(); } @Override @@ -185,7 +188,6 @@ public class MainService extends BaseService implements MainContact.MainView, Ne private final static long ONE_HOURS_TIME = 60 * 60 * 1000; private final static long TEN_MINUTES_TIME = 60 * 10 * 1000; - private void isScreenshot() { //1、检测应用使用情况,如果设备长时间运行一个应用,超过1小时,启动截屏一次。 //2、检测设备在非正常时间使用时,使用第三方应用,在运行10分钟后,启动截屏功能一次 @@ -193,8 +195,8 @@ public class MainService extends BaseService implements MainContact.MainView, Ne // TODO: 2021/12/20 计算当前app打开时间 String topPackageName = ForegroundAppUtil.getForegroundPackageName(MainService.this); Log.e(TAG, "isScreenshot: " + topPackageName); - String pkg = TimeUtils.getInstance().getAppPackageName(); - if (TextUtils.isEmpty(pkg)) { + String pkg = AppUsedTimeUtils.getInstance().getAppPackageName(); + if (TextUtils.isEmpty(pkg)|| BuildConfig.APPLICATION_ID.equals(pkg)) { return; } @@ -204,8 +206,8 @@ public class MainService extends BaseService implements MainContact.MainView, Ne Log.e(TAG, "isScreenshot: screenOn = " + screenOn); if (!screenOn) return; - long startTime = TimeUtils.getInstance().getStartTime(); - if (TimeUtils.getInstance().isNormalTime()) {//正常时间段 + long startTime = AppUsedTimeUtils.getInstance().getStartTime(); + if (AppUsedTimeUtils.getInstance().isNormalTime()) {//正常时间段 if (System.currentTimeMillis() - startTime >= ONE_HOURS_TIME) { Log.e(TAG, "isScreenshot: " + "截图"); doscreenshot(this); @@ -253,21 +255,21 @@ public class MainService extends BaseService implements MainContact.MainView, Ne if (!file.exists()) { throw new FileNotFoundException(filePath); } - Bitmap bitmap = BitmapFactory.decodeFile(filePath); - if (bitmap.getWidth() < bitmap.getHeight()) { - bitmap = ImageUtils.rotate(bitmap, -90, bitmap.getWidth(), bitmap.getHeight()); - } - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); - file.createNewFile(); - FileOutputStream fos = new FileOutputStream(file); - InputStream is = new ByteArrayInputStream(baos.toByteArray()); - int x; - byte[] b = new byte[1024 * 100]; - while ((x = is.read(b)) != -1) { - fos.write(b, 0, x); - } - fos.close(); +// Bitmap bitmap = BitmapFactory.decodeFile(filePath); +// if (bitmap.getWidth() < bitmap.getHeight()) { +// bitmap = ImageUtils.rotate(bitmap, -90, bitmap.getWidth(), bitmap.getHeight()); +// } +// ByteArrayOutputStream baos = new ByteArrayOutputStream(); +// bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); +// file.createNewFile(); +// FileOutputStream fos = new FileOutputStream(file); +// InputStream is = new ByteArrayInputStream(baos.toByteArray()); +// int x; +// byte[] b = new byte[1024 * 100]; +// while ((x = is.read(b)) != -1) { +// fos.write(b, 0, x); +// } +// fos.close(); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); return getSendFile(filePath, body); @@ -298,6 +300,89 @@ public class MainService extends BaseService implements MainContact.MainView, Ne }); } + + private LockScreenReceiver lockScreenReceiver; + + private void registerLockScreenReceiver() { + if (lockScreenReceiver == null) { + lockScreenReceiver = new LockScreenReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_USER_PRESENT); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SCREEN_OFF); + registerReceiver(lockScreenReceiver, filter); + } + + static class LockScreenReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (TextUtils.isEmpty(action)) return; + Log.e(TAG, "onReceive: " + action); + switch (action) { + default: + break; + case Intent.ACTION_USER_PRESENT: + resetStartTime(context); + break; + case Intent.ACTION_SCREEN_ON: + + break; + case Intent.ACTION_SCREEN_OFF: + //关闭屏幕上传数据 + sendAppUsed(context); + break; + } + } + } + + private static void resetStartTime(Context context) { + String topPackageName = ForegroundAppUtil.getForegroundPackageName(context); + Log.e(TAG, "resetStartTime: " + topPackageName); + AppUsedTimeUtils.getInstance().setAppPackageName(topPackageName); + AppUsedTimeUtils.getInstance().setStartTime(System.currentTimeMillis()); + } + + private static void sendAppUsed(Context context) { + String packagename = AppUsedTimeUtils.getInstance().getAppPackageName(); + Log.e(TAG, "onResume packagename == " + packagename); +// AppUsedTimeUtils.getInstance().setEndTime(System.currentTimeMillis()); + if (!TextUtils.isEmpty(packagename)) { + NetInterfaceManager.getInstance().getAppUsageRecordControl() + .sendappUsageRecord(Utils.getSerial(), + APKUtils.getAppNameByPackage(context, packagename), + packagename, + AppUsedTimeUtils.getInstance().getStartTime() / 1000, + AppUsedTimeUtils.getInstance().getEndTime() / 1000) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendAppUsed", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("sendAppUsed", "onNext: " + baseResponse); + } + + @Override + public void onError(Throwable e) { + Log.e("sendAppUsed", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("sendAppUsed", "onComplete: "); + } + }); + } else { + Log.e("fht", "app = null" + packagename); + } + } + //在这里处理任务执行中的状态,如进度进度条的刷新 @Download.onTaskRunning protected void running(DownloadTask task) { diff --git a/app/src/main/java/com/uiui/os/utils/APKUtils.java b/app/src/main/java/com/uiui/os/utils/APKUtils.java index 4630e72..a2684cf 100644 --- a/app/src/main/java/com/uiui/os/utils/APKUtils.java +++ b/app/src/main/java/com/uiui/os/utils/APKUtils.java @@ -13,14 +13,24 @@ import android.util.Log; import com.uiui.os.BuildConfig; +import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Set; public class APKUtils { - private static String[] excludePackageName = {BuildConfig.APPLICATION_ID}; + private static HashSet excludePackageName = new HashSet() {{ + this.add(BuildConfig.APPLICATION_ID); + this.add("org.chromium.browser"); + this.add("com.sprd.sprdnote"); + this.add("com.android.deskclock"); + this.add("com.alldocube.store"); + }}; + private static String TAG = APKUtils.class.getSimpleName(); public static ArrayList queryFilterAppInfo(Context context) { @@ -37,6 +47,7 @@ public class APKUtils { List resolveinfoList = pm.queryIntentActivities(resolveIntent, 0); Set allowPackages = new HashSet(); for (ResolveInfo resolveInfo : resolveinfoList) { + Log.i(TAG, "queryFilterAppInfo: " + resolveInfo.activityInfo.packageName); allowPackages.add(resolveInfo.activityInfo.packageName); } @@ -48,11 +59,28 @@ public class APKUtils { // if(app.uid > 10000){//通过uid排除系统应用,在一些手机上效果不好 // applicationInfos.add(app); // } - if (allowPackages.contains(app.packageName) && !Arrays.asList(excludePackageName).contains(app.packageName)) { + if (allowPackages.contains(app.packageName) && !excludePackageName.contains(app.packageName)) { // if (allowPackages.contains(app.packageName)) { applicationInfos.add(app); } } + applicationInfos.sort(new Comparator() { + @Override + public int compare(ApplicationInfo o1, ApplicationInfo o2) { + return Collator.getInstance(Locale.CHINESE).compare(o1.loadLabel(pm).toString(),o2.loadLabel(pm).toString()); +// return o1.loadLabel(pm).toString().compareTo(o2.loadLabel(pm).toString()); + } + }); + applicationInfos.sort(new Comparator() { + @Override + public int compare(ApplicationInfo o1, ApplicationInfo o2) { + if ((o1.flags & ApplicationInfo.FLAG_SYSTEM) <= (o2.flags & ApplicationInfo.FLAG_SYSTEM)) { + return 1; + } else { + return -1; + } + } + }); return applicationInfos; } @@ -180,4 +208,15 @@ public class APKUtils { return versionName; } + public static String getAppNameByPackage(Context context, String pkg) { + PackageManager packageManager = context.getPackageManager(); + try { + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(pkg, PackageManager.GET_META_DATA); + String packageName = packageManager.getApplicationLabel(applicationInfo).toString(); + return packageName; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return ""; + } } diff --git a/app/src/main/java/com/uiui/os/utils/AppUsedTimeUtils.java b/app/src/main/java/com/uiui/os/utils/AppUsedTimeUtils.java new file mode 100644 index 0000000..f71755c --- /dev/null +++ b/app/src/main/java/com/uiui/os/utils/AppUsedTimeUtils.java @@ -0,0 +1,169 @@ +package com.uiui.os.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.google.gson.Gson; +import com.google.gson.JsonParser; +import com.google.gson.reflect.TypeToken; + +import java.io.Serializable; +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class AppUsedTimeUtils { + private static final String TAG = AppUsedTimeUtils.class.getSimpleName(); + + @SuppressLint("StaticFieldLeak") + private static AppUsedTimeUtils sInstance; + private Context mContext; + + private SimpleDateFormat ruleSDF = new SimpleDateFormat("HH:mm:ss"); + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private AppTimeinfo appTimeinfo; + + private AppUsedTimeUtils(Context context) { + this.mContext = context; + appTimeinfo = getAppTimeinfo(); + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new AppUsedTimeUtils(context); + } + } + + public static AppUsedTimeUtils getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init TimeUtils first"); + } + return sInstance; + } + + private static String normalStartTime = "8:00:00"; + private static String unusualStartTime = "22:00:00"; + + static class AppTimeinfo implements Serializable { + private static final long serialVersionUID = 5373751133823666192L; + + AppTimeinfo() { + this.appPackageName = ""; + this.endTime = 0; + this.startTime = 0; + } + + private String appPackageName; + private long endTime; + private long startTime; + + public String getAppPackageName() { + return appPackageName; + } + + public void setAppPackageName(String appPackageName) { + this.appPackageName = appPackageName; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + @NonNull + @Override + public String toString() { + return JsonParser.parseString(new Gson().toJson(this)).getAsJsonObject().toString(); + } + } + + synchronized public void setAppPackageName(String name) { + appTimeinfo.setAppPackageName(name); + setAppTimeinfo(); + } + + synchronized public String getAppPackageName() { + return appTimeinfo.getAppPackageName(); + } + + synchronized public void setStartTime(long time) { + appTimeinfo.setStartTime(time); + setAppTimeinfo(); + } + + synchronized public long getStartTime() { + return appTimeinfo.getStartTime(); + } + + synchronized public void setEndTime(long time) { + appTimeinfo.setEndTime(time); + setAppTimeinfo(); + } + + synchronized public long getEndTime() { + return appTimeinfo.getEndTime(); + } + + synchronized private AppTimeinfo getAppTimeinfo() { + String jsonString = Settings.System.getString(mContext.getContentResolver(), "runningAppInfo"); + if (TextUtils.isEmpty(jsonString)) { + return new AppTimeinfo(); + } + Log.e(TAG, "getAppTimeinfo: " + jsonString); + Type type = new TypeToken() { + }.getType(); + Gson gson = new Gson(); + AppTimeinfo appTimeinfo = gson.fromJson(jsonString, type); + return appTimeinfo; + } + + synchronized private void setAppTimeinfo() { + String jsonString = JsonParser.parseString(appTimeinfo.toString()).getAsJsonObject().toString(); + Settings.System.putString(mContext.getContentResolver(), "runningAppInfo", jsonString); + } + + private static final long DAY_TIME = 1000 * 60 * 60 * 24; + + public boolean isNormalTime() { + long nowTime = System.currentTimeMillis(); + String nowTimeString = ruleSDF.format(new Date(nowTime)); // 时间戳转换日期 + try { + Date startDate = ruleSDF.parse(normalStartTime); + Date endDate = ruleSDF.parse(unusualStartTime); + Date now = ruleSDF.parse(nowTimeString); + Log.e(TAG, "isScreenshot: startDate = " + startDate); + Log.e(TAG, "isScreenshot: endDate = " + endDate); + Log.e(TAG, "isScreenshot: now = " + now); + if (startDate.getTime() <= now.getTime() && now.getTime() <= endDate.getTime()) { + return true; + } else if (endDate.getTime() < now.getTime() && now.getTime() <= startDate.getTime() + DAY_TIME) { + return false; + } + } catch (ParseException e) { + e.printStackTrace(); + Log.e(TAG, "isScreenshot: " + e.getMessage()); + } + return false; + } + + +} diff --git a/app/src/main/java/com/uiui/os/utils/IconUtils.java b/app/src/main/java/com/uiui/os/utils/IconUtils.java index f13e414..1cb201c 100644 --- a/app/src/main/java/com/uiui/os/utils/IconUtils.java +++ b/app/src/main/java/com/uiui/os/utils/IconUtils.java @@ -18,6 +18,7 @@ public class IconUtils { this.add("com.android.dialer");//电话 this.add("com.android.gallery3d");//图库 this.add("com.android.mms.ui");//信息 + this.add("com.android.messaging");//信息 this.add("com.android.music");//音乐 this.add("com.android.providers.downloads.ui");//下载 this.add("com.android.quicksearchbox");//搜索 @@ -45,6 +46,7 @@ public class IconUtils { this.add("com_android_dialer"); this.add("com_android_gallery3d_app"); this.add("com_android_mms_ui"); + this.add("com_android_mms_ui"); this.add("com_android_music"); this.add("com_android_providers_downloads_ui"); this.add("com_android_quicksearchbox"); diff --git a/app/src/main/java/com/uiui/os/utils/TimeUtils.java b/app/src/main/java/com/uiui/os/utils/TimeUtils.java deleted file mode 100644 index d9ed940..0000000 --- a/app/src/main/java/com/uiui/os/utils/TimeUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.uiui.os.utils; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.util.Log; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class TimeUtils { - @SuppressLint("StaticFieldLeak") - private static TimeUtils sInstance; - private Context mContext; - - private SimpleDateFormat ruleSDF = new SimpleDateFormat("HH:mm:ss"); - private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - private String TAG = TimeUtils.class.getSimpleName(); - - private TimeUtils(Context context) { - this.mContext = context; - } - - public static void init(Context context) { - if (sInstance == null) { - sInstance = new TimeUtils(context); - } - } - - public static TimeUtils getInstance() { - if (sInstance == null) { - throw new IllegalStateException("You must be init TimeUtils first"); - } - return sInstance; - } - - private static String normalStartTime = "8:00:00"; - private static String unusualStartTime = "22:00:00"; - - private String appPackageName; - private long endTime = 0; - private long startTime = 0; - - public void setAppPackageName(String name) { - this.appPackageName = name; - } - - public String getAppPackageName() { - return appPackageName; - } - - public void setStartTime(long time) { - this.startTime = time; - } - - public long getStartTime() { - return startTime; - } - - public void setEndTime(long time) { - this.endTime = time; - } - - public long getEndTime() { - return endTime; - } - - private static final long DAY_TIME = 1000 * 60 * 60 * 24; - - public boolean isNormalTime() { - long nowTime = System.currentTimeMillis(); - String nowTimeString = ruleSDF.format(new Date(nowTime)); // 时间戳转换日期 - try { - Date startDate = ruleSDF.parse(normalStartTime); - Date endDate = ruleSDF.parse(unusualStartTime); - Date now = ruleSDF.parse(nowTimeString); - Log.e(TAG, "isScreenshot: startDate = " + startDate); - Log.e(TAG, "isScreenshot: endDate = " + endDate); - Log.e(TAG, "isScreenshot: now = " + now); - if (startDate.getTime() <= now.getTime() && now.getTime() <= endDate.getTime()) { - return true; - } else if (endDate.getTime() < now.getTime() && now.getTime() <= startDate.getTime() + DAY_TIME) { - return false; - } - } catch (ParseException e) { - e.printStackTrace(); - Log.e(TAG, "isScreenshot: " + e.getMessage()); - } - return false; - } - - -} diff --git a/app/src/main/res/drawable-hdpi/com_android_appstore.png b/app/src/main/res/drawable-hdpi/com_android_appstore.png index 30862b0..cfc37e9 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_appstore.png and b/app/src/main/res/drawable-hdpi/com_android_appstore.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_browser.png b/app/src/main/res/drawable-hdpi/com_android_browser.png index 892b435..28d243b 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_browser.png and b/app/src/main/res/drawable-hdpi/com_android_browser.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_calculator2.png b/app/src/main/res/drawable-hdpi/com_android_calculator2.png index 761fc13..1de3635 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_calculator2.png and b/app/src/main/res/drawable-hdpi/com_android_calculator2.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_calendar.png b/app/src/main/res/drawable-hdpi/com_android_calendar.png index 93ef0a6..1119ba1 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_calendar.png and b/app/src/main/res/drawable-hdpi/com_android_calendar.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_camera.png b/app/src/main/res/drawable-hdpi/com_android_camera.png index 86e6155..a6397d1 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_camera.png and b/app/src/main/res/drawable-hdpi/com_android_camera.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_clean.png b/app/src/main/res/drawable-hdpi/com_android_clean.png index 7baf8a2..194da2c 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_clean.png and b/app/src/main/res/drawable-hdpi/com_android_clean.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_contacts.png b/app/src/main/res/drawable-hdpi/com_android_contacts.png index 686a553..35970d2 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_contacts.png and b/app/src/main/res/drawable-hdpi/com_android_contacts.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_deskclock.png b/app/src/main/res/drawable-hdpi/com_android_deskclock.png index ba985e6..9fbacbb 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_deskclock.png and b/app/src/main/res/drawable-hdpi/com_android_deskclock.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_dialer.png b/app/src/main/res/drawable-hdpi/com_android_dialer.png index 7083624..335090a 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_dialer.png and b/app/src/main/res/drawable-hdpi/com_android_dialer.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_email.png b/app/src/main/res/drawable-hdpi/com_android_email.png index 6c2fcf5..2eb7a70 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_email.png and b/app/src/main/res/drawable-hdpi/com_android_email.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_gallery3d_app.png b/app/src/main/res/drawable-hdpi/com_android_gallery3d_app.png index 2704c93..98e484f 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_gallery3d_app.png and b/app/src/main/res/drawable-hdpi/com_android_gallery3d_app.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_mms_ui.png b/app/src/main/res/drawable-hdpi/com_android_mms_ui.png index aea3f99..9f62b91 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_mms_ui.png and b/app/src/main/res/drawable-hdpi/com_android_mms_ui.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_music.png b/app/src/main/res/drawable-hdpi/com_android_music.png index afaa1cc..8beb546 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_music.png and b/app/src/main/res/drawable-hdpi/com_android_music.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_providers_downloads_ui.png b/app/src/main/res/drawable-hdpi/com_android_providers_downloads_ui.png index 3e7daad..55cd1e9 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_providers_downloads_ui.png and b/app/src/main/res/drawable-hdpi/com_android_providers_downloads_ui.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_quicksearchbox.png b/app/src/main/res/drawable-hdpi/com_android_quicksearchbox.png index fed06bb..fd8b051 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_quicksearchbox.png and b/app/src/main/res/drawable-hdpi/com_android_quicksearchbox.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_settings.png b/app/src/main/res/drawable-hdpi/com_android_settings.png index c683b06..e3ef259 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_settings.png and b/app/src/main/res/drawable-hdpi/com_android_settings.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_soundrecorder.png b/app/src/main/res/drawable-hdpi/com_android_soundrecorder.png index 4d10a8c..34a2ddd 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_soundrecorder.png and b/app/src/main/res/drawable-hdpi/com_android_soundrecorder.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_stk_stkmain.png b/app/src/main/res/drawable-hdpi/com_android_stk_stkmain.png index 6529029..0c460cc 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_stk_stkmain.png and b/app/src/main/res/drawable-hdpi/com_android_stk_stkmain.png differ diff --git a/app/src/main/res/drawable-hdpi/com_android_vdieo.png b/app/src/main/res/drawable-hdpi/com_android_vdieo.png index 22e10cc..d292dfd 100644 Binary files a/app/src/main/res/drawable-hdpi/com_android_vdieo.png and b/app/src/main/res/drawable-hdpi/com_android_vdieo.png differ diff --git a/app/src/main/res/drawable-hdpi/com_mediatek_filemanager.png b/app/src/main/res/drawable-hdpi/com_mediatek_filemanager.png index a68cc03..02a37cd 100644 Binary files a/app/src/main/res/drawable-hdpi/com_mediatek_filemanager.png and b/app/src/main/res/drawable-hdpi/com_mediatek_filemanager.png differ diff --git a/app/src/main/res/drawable-hdpi/com_mediatek_fmradio.png b/app/src/main/res/drawable-hdpi/com_mediatek_fmradio.png index 4bf4867..6eaf599 100644 Binary files a/app/src/main/res/drawable-hdpi/com_mediatek_fmradio.png and b/app/src/main/res/drawable-hdpi/com_mediatek_fmradio.png differ diff --git a/app/src/main/res/drawable-hdpi/note_nodata.png b/app/src/main/res/drawable-hdpi/note_nodata.png new file mode 100644 index 0000000..f9a5ea1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/note_nodata.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/close.png b/app/src/main/res/drawable-xxxhdpi/close.png new file mode 100644 index 0000000..37f2f88 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/close.png differ diff --git a/app/src/main/res/drawable/voice_background.xml b/app/src/main/res/drawable/voice_background.xml index 8243268..0383881 100644 --- a/app/src/main/res/drawable/voice_background.xml +++ b/app/src/main/res/drawable/voice_background.xml @@ -1,7 +1,7 @@ - + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_custom.xml b/app/src/main/res/layout-land/fragment_custom.xml index 1628892..387ea91 100644 --- a/app/src/main/res/layout-land/fragment_custom.xml +++ b/app/src/main/res/layout-land/fragment_custom.xml @@ -44,7 +44,7 @@ android:layout_marginTop="8dp" android:text="天气预报" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -92,20 +92,35 @@ android:layout_marginTop="8dp" android:text="爱心守护" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + @@ -160,7 +187,7 @@ android:layout_marginTop="8dp" android:text="我的闹钟" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -173,7 +200,7 @@ android:gravity="center_horizontal" android:text="添加闹钟" android:textColor="@color/white" - android:textSize="17sp" + android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -205,7 +232,7 @@ android:layout_marginTop="8dp" android:text="设备电量" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -231,7 +258,7 @@ android:maxLines="1" android:singleLine="true" android:textColor="@color/black" - android:textSize="24sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.497" @@ -255,7 +282,7 @@ android:layout_marginTop="8dp" android:text="我的WiFi" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -278,7 +305,7 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="@color/black" - android:textSize="24sp" + android:textSize="0sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -297,14 +324,16 @@ android:layout_width="140dp" android:layout_height="140dp" app:cpvDuration="1000" - app:cpvLabelTextSize="34sp" + app:cpvLabelTextSize="26sp" app:cpvNormalColor="#D8D6D7" app:cpvShowTick="false" app:cpvStrokeWidth="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.481" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.48" /> diff --git a/app/src/main/res/layout-port/activity_emergency.xml b/app/src/main/res/layout-port/activity_emergency.xml new file mode 100644 index 0000000..5cc0c5a --- /dev/null +++ b/app/src/main/res/layout-port/activity_emergency.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-port/fragment_custom.xml b/app/src/main/res/layout-port/fragment_custom.xml index 584e3d0..201be85 100644 --- a/app/src/main/res/layout-port/fragment_custom.xml +++ b/app/src/main/res/layout-port/fragment_custom.xml @@ -46,7 +46,7 @@ android:layout_marginTop="8dp" android:text="天气预报" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -91,15 +91,29 @@ android:layout_marginTop="8dp" android:text="爱心守护" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + @@ -112,6 +126,7 @@ android:orientation="horizontal"> + + @@ -171,7 +198,7 @@ android:gravity="center_horizontal" android:text="添加闹钟" android:textColor="@color/white" - android:textSize="17sp" + android:textSize="15sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -209,7 +236,7 @@ android:layout_marginTop="8dp" android:text="设备电量" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -219,7 +246,7 @@ android:layout_width="70dp" android:layout_height="40dp" android:adjustViewBounds="true" - android:scaleType="centerInside" + android:scaleType="centerCrop" android:src="@drawable/charging" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="@+id/tv_battery" @@ -235,7 +262,7 @@ android:maxLines="1" android:singleLine="true" android:textColor="@color/black" - android:textSize="24sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.497" @@ -258,7 +285,7 @@ android:layout_marginTop="8dp" android:text="我的WiFi" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -279,7 +306,7 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textColor="@color/black" - android:textSize="24sp" + android:textSize="20sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -305,6 +332,7 @@ android:layout_height="160dp" android:layout_margin="8dp" app:cpvDuration="1000" + app:cpvLabelTextSize="26sp" app:cpvNormalColor="#D8D6D7" app:cpvShowTick="false" app:cpvStrokeWidth="28dp" @@ -321,7 +349,7 @@ android:layout_marginTop="8dp" android:text="一键加速" android:textColor="@color/black" - android:textSize="19sp" + android:textSize="15sp" android:textStyle="bold" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/item_notification.xml b/app/src/main/res/layout/item_notification.xml index 3cbf69c..5cdb1a6 100644 --- a/app/src/main/res/layout/item_notification.xml +++ b/app/src/main/res/layout/item_notification.xml @@ -8,8 +8,7 @@ + android:layout_margin="16dp"> diff --git a/app/src/main/res/layout/item_sosnumber.xml b/app/src/main/res/layout/item_sosnumber.xml new file mode 100644 index 0000000..7cc743d --- /dev/null +++ b/app/src/main/res/layout/item_sosnumber.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 44261e3..6b56b9c 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 44261e3..6b56b9c 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 44261e3..6b56b9c 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 44261e3..6b56b9c 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 44261e3..6b56b9c 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 75ec446..559e73e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -12,5 +12,6 @@ #F8B551 #0480FF #4D4B50 + #FF0000 diff --git a/build.gradle b/build.gradle index 1ed50b7..ea6dd8d 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,11 @@ allprojects { jcenter() maven { url "https://jitpack.io" } } + gradle.projectsEvaluated { + tasks.withType(JavaCompile) { + options.compilerArgs.add('-Xbootclasspath/p:app/libs/framework.jar') + } + } } task clean(type: Delete) { diff --git a/settings.gradle b/settings.gradle index 375a9f9..ce2b898 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -rootProject.name='老人平板桌面' include ':app' +rootProject.name='老人平板桌面' \ No newline at end of file