From e4ce6a79c043b161abede7f13d16e0cff3ea993a Mon Sep 17 00:00:00 2001 From: tongtongstudio Date: Mon, 10 Feb 2025 17:04:15 +0800 Subject: [PATCH] =?UTF-8?q?version:2.0.7=20bugfixes:=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E9=97=B9=E9=92=9F=E9=BB=91=E5=B1=8F=20update:=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=8A=A5=E6=97=B6=E4=BA=AE=E5=B1=8F=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=97=B9=E9=92=9F=E6=8E=92=E5=BA=8F=EF=BC=8C=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- .../activity/alarm/add/AlarmAddActivity.java | 6 +- .../alarm/edit/AlarmEditActivity.java | 6 +- .../activity/contact/AddContactActivity.java | 6 +- .../activity/contact/EditContactActivity.java | 4 +- .../activity/emergency/EmergencyActivity.java | 3 +- .../os/activity/noti/NoticeActivity.java | 4 +- .../os/activity/noti/NoticeInfoActivity.java | 21 ++-- .../screenlock/ScreenLockActivity.java | 17 +++- .../java/com/vscool/os/alarm/AlarmUtils.java | 8 +- .../vscool/os/disklrucache/CacheHelper.java | 8 +- .../os/fragment/contact/ContactFragment.java | 5 +- .../os/fragment/contact/ContactViewModel.java | 42 ++++++++ .../fragment/phone/dialer/DialerFragment.java | 39 +++++--- .../os/network/NetInterfaceManager.java | 43 +++++++- .../os/service/WeAccessibilityService.java | 73 ++++++++++++-- .../vscool/os/service/main/MainService.java | 14 ++- .../com/vscool/os/utils/ContactsUtils.java | 97 +++++++++++++------ .../vscool/os/utils/ForegroundAppUtil.java | 12 +-- .../java/com/vscool/os/utils/ScreenUtil.java | 21 ---- .../res/xml/accessibility_service_config.xml | 6 +- 21 files changed, 318 insertions(+), 121 deletions(-) delete mode 100644 app/src/main/java/com/vscool/os/utils/ScreenUtil.java diff --git a/app/build.gradle b/app/build.gradle index ade7b1b..19401cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,8 @@ android { minSdkVersion 24 targetSdkVersion 29 - versionCode 207 - versionName "2.0.6" + versionCode 208 + versionName "2.0.7" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/com/vscool/os/activity/alarm/add/AlarmAddActivity.java b/app/src/main/java/com/vscool/os/activity/alarm/add/AlarmAddActivity.java index 6669d80..e00d822 100644 --- a/app/src/main/java/com/vscool/os/activity/alarm/add/AlarmAddActivity.java +++ b/app/src/main/java/com/vscool/os/activity/alarm/add/AlarmAddActivity.java @@ -31,7 +31,7 @@ import com.vscool.os.databinding.ActivityAlarmAddBinding; import com.vscool.os.service.main.MainService; import com.vscool.os.utils.FFmpegUtils; import com.vscool.os.utils.FileUtil; -import com.vscool.os.utils.ScreenUtil; +import com.vscool.os.utils.ScreenUtils; import com.vscool.os.utils.TimeUtils; import java.io.File; @@ -135,7 +135,7 @@ public class AlarmAddActivity extends BaseMvvmActivity { private static final String TAG = "ContactListViewModel"; private MMKV mMMKV = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE); @@ -55,4 +64,37 @@ public class ContactViewModel extends BaseViewModel>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getContactNoSave", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getContactNoSave", "onNext: "); + if (listBaseResponse.code == 200) { + List contactList = listBaseResponse.data; + mMMKV.putString(UrlAddress.GET_MAIL_LIST, GsonUtils.toJSONString(contactList)); + mContactListData.setValue(contactList); + } else { + mMMKV.remove(UrlAddress.GET_MAIL_LIST); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getContactNoSave", "onError: "); + } + + @Override + public void onComplete() { + Log.e("getContactNoSave", "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/vscool/os/fragment/phone/dialer/DialerFragment.java b/app/src/main/java/com/vscool/os/fragment/phone/dialer/DialerFragment.java index 5a74acf..98f5a18 100644 --- a/app/src/main/java/com/vscool/os/fragment/phone/dialer/DialerFragment.java +++ b/app/src/main/java/com/vscool/os/fragment/phone/dialer/DialerFragment.java @@ -37,7 +37,7 @@ public class DialerFragment extends BaseMvvmFragment soundMap = new HashMap<>(); public DialerFragment() { @@ -67,23 +67,23 @@ public class DialerFragment extends BaseMvvmFragment filter = list.stream().filter(alarmClockData -> !alarmClockData.isDeleted()).collect(Collectors.toList()); + + + List filter = list.stream().filter(alarmClockData -> !alarmClockData.isDeleted()) + .sorted(new Comparator() { + @Override + public int compare(AlarmClockData o1, AlarmClockData o2) { + long time1 = getClockTimestamp(o1); + long time2 = getClockTimestamp(o2); + return Long.compare(time1, time2); + } + }) + .collect(Collectors.toList()); + if (callback != null) callback.setAlarmClock(filter); } } }; } + SimpleDateFormat mSimpleDateFormatYear = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + SimpleDateFormat mSimpleDateFormatHour = new SimpleDateFormat("HH:mm"); + + private long getClockTimestamp(AlarmClockData alarmClockData) { + long timestamp; + Date date = new Date(); + if (alarmClockData.getType() == 1) { + try { + date = mSimpleDateFormatYear.parse(alarmClockData.getTime()); + } catch (ParseException e) { + e.printStackTrace(); + Log.e(TAG, "getClockTimestamp: " + e.getMessage()); + } + } else { + try { + date = mSimpleDateFormatHour.parse(alarmClockData.getTime()); + } catch (ParseException e) { + e.printStackTrace(); + Log.e(TAG, "getClockTimestamp: " + e.getMessage()); + } + } + timestamp = date.getTime(); + return timestamp; + } + public interface SnInfoCallback { void setSnInfo(SnInfo snInfo); } diff --git a/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java b/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java index d997f98..fdf5eec 100644 --- a/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java +++ b/app/src/main/java/com/vscool/os/service/WeAccessibilityService.java @@ -17,17 +17,20 @@ import android.util.Log; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityWindowInfo; import android.widget.Toast; import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; import com.vscool.os.bean.Contact; import com.vscool.os.config.CommonConfig; +import com.vscool.os.utils.ForegroundAppUtil; import java.util.List; /** * 通过微信标签最高支持8.0.49,8.0.50 获取不到数据 + * 通过 {@link android.accessibilityservice.AccessibilityService#getWindows}和修改accessibility-service 配置能遍历屏幕元素 */ public class WeAccessibilityService extends AccessibilityService { private static final String TAG = "WeAccessibilityService"; @@ -132,7 +135,7 @@ public class WeAccessibilityService extends AccessibilityService { * @param event */ private void _onAccessibilityEvent(AccessibilityEvent event) { - + Log.e(TAG, "_onAccessibilityEvent: " + mCurrentStep); switch (mCurrentStep) { case WAITING: break; @@ -147,13 +150,18 @@ public class WeAccessibilityService extends AccessibilityService { } } } - Log.e(TAG, "_onAccessibilityEvent: " + mCurrentStep); switch (mCurrentStep) { case WAITING: - if (!mAutoAccept) return; + mAutoAccept = mMMKV.decodeBool(CommonConfig.WECHAT_CALL_AUTO_ACCEPT, false); + Log.e(TAG, "_onAccessibilityEvent: mAutoAccept = " + mAutoAccept); + if (!mAutoAccept) { + return; + } if (stepAnswer(Property.DESCRIPTION, RECEIVE_DESCRIPTION)) { mCurrentStep = Step.WAITING; Toast.makeText(this, "已自动接听视频/语音", Toast.LENGTH_LONG).show(); + } else { +// clickAnswer(); } break; case CLICK_HOME://主页能找到直接点击进去更多 @@ -167,8 +175,11 @@ public class WeAccessibilityService extends AccessibilityService { break; case CLICK_CONTACT://进入通讯录界面 - touchContact(); -// step(Property.TEXT, CONTACT_TEXT, Step.FIND_TAG); + if (stepHome(Property.TEXT, CONTACT_TEXT, Step.FIND_TAG)) { + Log.e(TAG, "_onAccessibilityEvent: enter contact"); + } else { + touchContact(); + } break; case FIND_CONTACT://模拟滑动找到联系人 findContact(Property.TEXT, mName, Step.CLICK_NAME); @@ -230,6 +241,23 @@ public class WeAccessibilityService extends AccessibilityService { } } + @Deprecated + private void clickAnswer() { + String className = ForegroundAppUtil.getForegroundActivityName(WeAccessibilityService.this); + Log.e(TAG, "clickAnswer: " + className); + if (!TextUtils.isEmpty(className)) { + if ("com.tencent.mm.plugin.voip.ui.VideoActivity".contentEquals(className)) { + boolean successful = clickByPoint(595, 1376); + Log.e(TAG, "clickAnswer: " + successful); + if (successful) { + Toast.makeText(this, "已自动接听视频/语音", Toast.LENGTH_LONG).show(); + } + } else { + Log.e(TAG, "clickAnswer: Not in the answering interface"); + } + } + } + private boolean step(Property type, String text, Step nextStep) { AccessibilityNodeInfo node = findNode(getRootInActiveWindow(), type, text); if (node != null) { @@ -249,6 +277,27 @@ public class WeAccessibilityService extends AccessibilityService { } } + // TODO: 2025/2/8 先把通讯录点击的换成node + private boolean stepHome(Property type, String text, Step nextStep) { + AccessibilityNodeInfo node = findNode(getWindows(), type, text); + if (node != null) { + Rect rect = new Rect(); + node.getBoundsInScreen(rect); + Log.e(TAG, "step: rect = " + rect); + if (rect.left < 0 || rect.top < 0 || rect.right < 0 || rect.bottom < 0) { + return false; + } + clickNode(node); + Log.e(TAG, "step: mCurrentStep: " + mCurrentStep + " done"); + mCurrentStep = nextStep; + Log.e(TAG, "step: next: " + mCurrentStep); + return true; + } else { + return false; + } + } + + @Deprecated private void touchContact() { boolean successful = clickByPoint(268, 1440); if (successful) { @@ -392,6 +441,18 @@ public class WeAccessibilityService extends AccessibilityService { return null; } + private AccessibilityNodeInfo findNode(List windows, Property type, String text) { + for (AccessibilityWindowInfo accessibilityWindowInfo : windows) { + AccessibilityNodeInfo nodeInfo = findNode(accessibilityWindowInfo.getRoot(), type, text); + if (nodeInfo != null) { + return nodeInfo; + } + } + Log.e(TAG, "findNode windows: not found"); + return null; + } + + private void clickNode(AccessibilityNodeInfo node) { try { Log.e(TAG, "clickNode: getText = " + node.getText()); @@ -446,7 +507,7 @@ public class WeAccessibilityService extends AccessibilityService { } private boolean stepAnswer(Property type, String text) { - AccessibilityNodeInfo node = findNode(getRootInActiveWindow(), type, text); + AccessibilityNodeInfo node = findNode(getWindows(), type, text); if (node != null) { Point point = getPointtByNode(node); Log.e(TAG, "stepAnswer: " + point); diff --git a/app/src/main/java/com/vscool/os/service/main/MainService.java b/app/src/main/java/com/vscool/os/service/main/MainService.java index 3a54d9f..f44b307 100644 --- a/app/src/main/java/com/vscool/os/service/main/MainService.java +++ b/app/src/main/java/com/vscool/os/service/main/MainService.java @@ -79,6 +79,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 PowerManager mPowerManager; + private PowerManager.WakeLock mWakeLock; + private SoundPool mSoundPool; private HashMap soundMap = new HashMap<>(); @@ -161,8 +164,9 @@ public class MainService extends BaseRxService implements MainSContact.MainSView public void onCreate() { super.onCreate(); Log.e(TAG, "onCreate: "); - // ApkUtils.UninstallAPP(this, "com.joytv.live"); - // ApkUtils.UninstallAPP(this, "com.tencent.android.qqdownloader"); + + mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + mWakeLock = mPowerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "WakeAndLock"); AudioAttributes attr = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM) // 设置音效使用场景 .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).build(); // 设置音效的类型 @@ -245,6 +249,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView @Override public void onNext(@NonNull Integer hour) { Log.e("mTimeSignalCallback", "onNext: "); + mWakeLock.acquire(60 * 1000L); mSoundPool.play(soundMap.get(hour), 1, 1, 0, 0, 1); } @@ -317,6 +322,11 @@ public class MainService extends BaseRxService implements MainSContact.MainSView if (mSmsReceiver != null) { unregisterReceiver(mSmsReceiver); } + + if (mSoundPool != null) { + mSoundPool.release(); + mSoundPool = null; + } } public boolean isScreenOn() { diff --git a/app/src/main/java/com/vscool/os/utils/ContactsUtils.java b/app/src/main/java/com/vscool/os/utils/ContactsUtils.java index 0bee311..7264e00 100644 --- a/app/src/main/java/com/vscool/os/utils/ContactsUtils.java +++ b/app/src/main/java/com/vscool/os/utils/ContactsUtils.java @@ -14,11 +14,7 @@ import android.provider.ContactsContract; import android.text.TextUtils; import android.util.Log; -import androidx.annotation.Nullable; - import com.bumptech.glide.Glide; -import com.bumptech.glide.request.target.SimpleTarget; -import com.bumptech.glide.request.transition.Transition; import com.vscool.os.R; import com.vscool.os.bean.Contact; import com.vscool.os.bean.ContactId; @@ -31,7 +27,6 @@ import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; -import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.ObservableEmitter; @@ -47,21 +42,27 @@ public class ContactsUtils { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + long time = System.currentTimeMillis(); Log.e(TAG, "saveContactPhone: " + contact.getMobile() + " isExist = " + ContactsUtils.isExist(context, contact.getMobile())); - Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).into(new SimpleTarget() { - @Override - public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition transition) { - if (ContactsUtils.isExist(context, contact.getMobile())) { - updateContactPhone(context, contact, resource); - } else { - insertContactPhone(context, contact, resource); - } + if (TextUtils.isEmpty(contact.getAvatar())) { + Bitmap bitmap = Glide.with(context).asBitmap().load(R.drawable.default_avatar).override(200, 200).submit().get(); + if (ContactsUtils.isExist(context, contact.getMobile())) { + updateContactPhone(context, contact, bitmap); + } else { + insertContactPhone(context, contact, bitmap); } - }); - emitter.onNext(1L); + } else { + Bitmap bitmap = Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).error(R.drawable.default_avatar).submit().get(); + if (ContactsUtils.isExist(context, contact.getMobile())) { + updateContactPhone(context, contact, bitmap); + } else { + insertContactPhone(context, contact, bitmap); + } + } + emitter.onNext(System.currentTimeMillis() - time); } }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(Schedulers.newThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -91,27 +92,33 @@ public class ContactsUtils { Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(@NonNull ObservableEmitter emitter) throws Throwable { + long time = System.currentTimeMillis(); for (Contact contact : contactList) { if (TextUtils.isEmpty(contact.getMobile())) { continue; } Log.e(TAG, "saveContactPhone: " + contact.getMobile() + " isExist = " + ContactsUtils.isExist(context, contact.getMobile())); - Glide.with(context).asBitmap().load(contact.getAvatar()).error(R.drawable.default_avatar).override(200, 200).into(new SimpleTarget() { - @Override - public void onResourceReady(@androidx.annotation.NonNull Bitmap resource, @Nullable Transition transition) { - if (ContactsUtils.isExist(context, contact.getMobile())) { - updateContactPhone(context, contact, resource); - emitter.onNext(0L); - } else { - insertContactPhone(context, contact, resource); - emitter.onNext(1L); - } + if (TextUtils.isEmpty(contact.getAvatar())) { + Bitmap bitmap = Glide.with(context).asBitmap().load(R.drawable.default_avatar).override(200, 200).submit().get(); + if (ContactsUtils.isExist(context, contact.getMobile())) { + updateContactPhone(context, contact, bitmap); + } else { + insertContactPhone(context, contact, bitmap); } - }); + } else { + Bitmap bitmap = Glide.with(context).asBitmap().load(contact.getAvatar()).override(200, 200).error(R.drawable.default_avatar).submit().get(); + if (ContactsUtils.isExist(context, contact.getMobile())) { + updateContactPhone(context, contact, bitmap); + } else { + insertContactPhone(context, contact, bitmap); + } + } + } + emitter.onNext(System.currentTimeMillis() - time); } }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(Schedulers.newThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -162,6 +169,24 @@ public class ContactsUtils { resolver.insert(ContactsContract.Data.CONTENT_URI, values); } + public static void insertContactPhone(Context context, Contact contact) { + ContentValues values = new ContentValues(); + long rawContactId = ContentUris.parseId(context.getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values)); + Log.e(TAG, "insertContactPhone: rawContactId = " + rawContactId); + ContentResolver resolver = context.getContentResolver(); + + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); + + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getMobile()); + values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + } public static void updateContactPhone(Context context, Contact contact, Bitmap bitmap) { long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); @@ -173,6 +198,7 @@ public class ContactsUtils { values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); @@ -181,6 +207,7 @@ public class ContactsUtils { values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, out.toByteArray()); resolver.insert(ContactsContract.Data.CONTENT_URI, values); + values.clear(); // values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); @@ -204,6 +231,18 @@ public class ContactsUtils { // int result = resolver.update(ContactsContract.Data.CONTENT_URI, values, ContactsContract.Data.RAW_CONTACT_ID + "=?", new String[]{String.valueOf(bean.getId())}); } + public static void updateContactPhone(Context context, Contact contact) { + long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); + Log.e(TAG, "updateContactPhone: rawContactId = " + rawContactId); + ContentResolver resolver = context.getContentResolver(); + + ContentValues values = new ContentValues(); + values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactId); + values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); + values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contact.getName()); + resolver.insert(ContactsContract.Data.CONTENT_URI, values); + } + public static void update(Context context, Contact contact, Bitmap bitmap) { long rawContactId = ContactsUtils.getRawContactId(context, contact.getMobile()); @@ -272,7 +311,7 @@ public class ContactsUtils { } }) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(Schedulers.newThread()) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { diff --git a/app/src/main/java/com/vscool/os/utils/ForegroundAppUtil.java b/app/src/main/java/com/vscool/os/utils/ForegroundAppUtil.java index 74a82f9..e97e9d2 100644 --- a/app/src/main/java/com/vscool/os/utils/ForegroundAppUtil.java +++ b/app/src/main/java/com/vscool/os/utils/ForegroundAppUtil.java @@ -31,16 +31,8 @@ public class ForegroundAppUtil { * 获取栈顶的应用包名 */ public static String getForegroundActivityName(Context context) { - String currentClassName = ""; - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - ActivityManager manager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); - currentClassName = manager.getRunningTasks(1).get(0).topActivity.getPackageName(); - } else { - UsageStats initStat = getForegroundUsageStats(context, START_TIME, END_TIME); - if (initStat != null) { - currentClassName = initStat.getPackageName(); - } - } + ActivityManager manager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); + String currentClassName = manager.getRunningTasks(1).get(0).topActivity.getClassName(); return currentClassName; } diff --git a/app/src/main/java/com/vscool/os/utils/ScreenUtil.java b/app/src/main/java/com/vscool/os/utils/ScreenUtil.java deleted file mode 100644 index 1fa9dca..0000000 --- a/app/src/main/java/com/vscool/os/utils/ScreenUtil.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.vscool.os.utils; - -import android.content.Context; - -public class ScreenUtil { - /** - * 根据手机的分辨率从 dp 的单位 转成为 px(像素) - */ - public static int dip2px(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (dpValue * scale + 0.5f); - } - - /** - * 根据手机的分辨率从 px(像素) 的单位 转成为 dp - */ - public static int px2dip(Context context, float pxValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (int) (pxValue / scale + 0.5f); - } -} diff --git a/app/src/main/res/xml/accessibility_service_config.xml b/app/src/main/res/xml/accessibility_service_config.xml index b45611f..143597b 100644 --- a/app/src/main/res/xml/accessibility_service_config.xml +++ b/app/src/main/res/xml/accessibility_service_config.xml @@ -1,7 +1,7 @@