version:1.4.8

fix:修复一键拨号
update:增加sim卡显示
This commit is contained in:
2025-03-10 09:26:15 +08:00
parent 398d353be9
commit 4275dbfff0
7 changed files with 156 additions and 63 deletions

View File

@@ -15,8 +15,8 @@ android {
applicationId "com.xxpatx.os"
minSdkVersion 24
targetSdkVersion 29
versionCode 1048
versionName "1.4.8"
versionCode 1049
versionName "1.4.9"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

View File

@@ -25,7 +25,6 @@ import com.xxpatx.os.databinding.ActivityContactListBinding;
import com.xxpatx.os.dialog.EditContactDialog;
import com.zackratos.ultimatebarx.ultimatebarx.java.UltimateBarX;
import java.util.ArrayList;
import java.util.List;
public class ContactListActivity extends BaseMvvmActivity<ContactListViewModel, ActivityContactListBinding> {
@@ -115,35 +114,6 @@ public class ContactListActivity extends BaseMvvmActivity<ContactListViewModel,
mViewModel.getContact();
}
public static final String NAME = "name";
public static final String NUMBER = "number";
private List<Contact> getSIMContacts() {
getAll();
List<Contact> contactList = new ArrayList<>();
ContentResolver resolver = getContentResolver();
// 获取Sims卡联系人
Uri uri = Uri.parse("content://icc/adn");
Cursor phoneCursor = resolver.query(uri, null, null, null, null);
if (phoneCursor != null) {
int colName = phoneCursor.getColumnIndex(NAME);
int colNumber = phoneCursor.getColumnIndex(NUMBER);
while (phoneCursor.moveToNext()) {
String number = phoneCursor.getString(colNumber);
// 当手机号码为空的或者为空字段 跳过当前循环
String username = phoneCursor.getString(colName);
long id = phoneCursor.getLong(phoneCursor.getColumnIndex("_id"));
Log.e(TAG, "getSIMContacts: number = " + number + " username = " + username + " _id = " + id);
Contact contact = new Contact(username, number, true);
contact.setId(id);
contactList.add(contact);
}
phoneCursor.close();
}
return contactList;
}
private void getAll() {
ContentResolver resolver = getContentResolver();
Cursor adnCursor = resolver.query(Uri.parse("content://icc/adn/subId/0"), null, null, null, null);

View File

@@ -30,6 +30,7 @@ import com.xxpatx.os.bean.AppInfo;
import com.xxpatx.os.bean.SystemSettings;
import com.xxpatx.os.config.CommonConfig;
import com.xxpatx.os.databinding.ActivitySettingBinding;
import com.xxpatx.os.dialog.CustomDialog;
import com.xxpatx.os.service.WeAccessibilityService;
import com.xxpatx.os.service.main.MainService;
import com.xxpatx.os.utils.AccessibilityUtils;
@@ -301,13 +302,34 @@ public class SettingActivity extends BaseMvvmActivity<SettingViewModel, Activity
public void setHourlyTimeSignal(View view) {
boolean hourly_time = mMMKV.decodeBool(CommonConfig.HOURLY_TIME_SIGNAL_KEY, false);
Log.e(TAG, "setHourlyTimeSignal: hourly_time = " + hourly_time);
mMMKV.encode(CommonConfig.HOURLY_TIME_SIGNAL_KEY, !hourly_time);
mViewDataBinding.setHourlyTime(!hourly_time);
if (!hourly_time) {
CustomDialog customDialog = new CustomDialog(SettingActivity.this);
customDialog.setTitle("温馨提示")
.setMessage("整点报时时间为7点至21点")
.setOnClickBottomListener(new CustomDialog.OnClickBottomListener() {
@Override
public void onPositiveClick() {
mMMKV.encode(CommonConfig.HOURLY_TIME_SIGNAL_KEY, true);
mViewDataBinding.setHourlyTime(true);
Intent intent = new Intent(MainService.XXOS_ACTION_TIME_CHANGED);
sendBroadcast(intent);
customDialog.dismiss();
}
@Override
public void onNegtiveClick() {
customDialog.dismiss();
}
});
customDialog.show();
} else {
mMMKV.encode(CommonConfig.HOURLY_TIME_SIGNAL_KEY, false);
mViewDataBinding.setHourlyTime(false);
}
}
public void setStatusBar(View view) {
int code = Settings.System.getInt(getContentResolver(), CommonConfig.ACTION_STATUS_BAR_STATE, 0);
boolean statusBar = code == 1;
boolean statusBar = Settings.System.getInt(getContentResolver(), CommonConfig.ACTION_STATUS_BAR_STATE, 0) == 1;
String statusbarStatus;
if (statusBar) {
statusbarStatus = CommonConfig.ACTION_HIDE_STATUS_BAR;
@@ -320,7 +342,7 @@ public class SettingActivity extends BaseMvvmActivity<SettingViewModel, Activity
Log.e(TAG, "setStatusBar: old statusBar = " + statusBar);
mViewDataBinding.setStatusBar(!statusBar);
Settings.System.putInt(getContentResolver(), CommonConfig.ACTION_STATUS_BAR_STATE, code == 1 ? 0 : 1);
Settings.System.putInt(getContentResolver(), CommonConfig.ACTION_STATUS_BAR_STATE, statusBar ? 0 : 1);
}
public void setSimCard(View view) {

View File

@@ -16,12 +16,16 @@ import io.reactivex.rxjava3.subjects.BehaviorSubject;
public abstract class BaseRxService extends Service implements LifecycleProvider<ActivityEvent> {
public final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
private final BehaviorSubject<ActivityEvent> lifecycleSubject = BehaviorSubject.create();
public BaseRxService() {
super();
}
public BehaviorSubject<ActivityEvent> getLifecycleSubject() {
return lifecycleSubject;
}
@Override
public final Observable<ActivityEvent> lifecycle() {
return lifecycleSubject.hide();

View File

@@ -116,6 +116,8 @@ public class CommonConfig {
public static final String CONTACT_HOME_KEY = "contact_home_control";
/*整点报时*/
public static final String HOURLY_TIME_SIGNAL_KEY = "Hourly_Time_Signal";
/*显示SIM卡联系人*/
public static final String SHOW_SIM_CARD_CONTACT = "show_sim_card_contact_key";
/*后台设置的*/
/*主页按钮开关*/

View File

@@ -1,6 +1,8 @@
package com.xxpatx.os.service.main;
import android.app.ActivityManager;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -46,6 +48,7 @@ import com.xxpatx.os.utils.ApkUtils;
import com.xxpatx.os.utils.AppUsedTimeUtils;
import com.xxpatx.os.utils.CmdUtil;
import com.xxpatx.os.utils.ForegroundAppUtil;
import com.xxpatx.os.utils.TimeUtils;
import com.xxpatx.os.utils.Utils;
import java.io.File;
@@ -88,8 +91,12 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
private WindowManager.LayoutParams mBallParams;
public boolean isBallShown = false;
private static final String Float_Window_X = "float_window_x_key";
private static final String Float_Window_Y = "float_window_y_key";
private static final String FLOAT_WINDOW_X = "float_window_x_key";
private static final String FLOAT_WINDOW_Y = "float_window_y_key";
private static final int TIME_REQUEST_CODE = 9999;
private static final String XXOS_ACTION_TIME_TICK = "xxos_time_tick";
public static final String XXOS_ACTION_TIME_CHANGED = "xxos_time_changed";
public MainService() {
@@ -204,7 +211,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
mPresenter = new MainSPresenter(this);
mPresenter.attachView(this);
mPresenter.setLifecycle(lifecycleSubject);
mPresenter.setLifecycle(getLifecycleSubject());
NetworkUtils.registerNetworkStatusChangedListener(this);
mPresenter.addAlarmClock();
@@ -219,9 +226,11 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
}
mMMKV.encode(CommonConfig.APP_VERSION_CODE, BuildConfig.VERSION_CODE);
setAlarmTime();
registerTimeChangedReceiver();
registerAlarmReceiver();
registerTimeReceiver();
registFastCallReceive();
registerFastCallReceive();
registerLockScreenReceiver();
registerOperateAlarmClockReceiver();
registerScreenLockReceiver();
@@ -233,7 +242,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
mTimeSignalCallback = emitter::onNext;
}
}).throttleFirst(1, TimeUnit.MINUTES)
.compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY))
.compose(RxLifecycle.bindUntilEvent(getLifecycleSubject(), ActivityEvent.DESTROY))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Integer>() {
@@ -244,8 +253,13 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
@Override
public void onNext(@NonNull Integer hour) {
Log.e("mTimeSignalCallback", "onNext: ");
mSoundPool.play(soundMap.get(hour), 1, 1, 0, 0, 1);
Log.e("mTimeSignalCallback", "onNext: " + hour);
if (hour > 6 && hour < 22) {
mSoundPool.play(soundMap.get(hour), 1, 1, 0, 0, 1);
} else {
/*10点到86点不报时*/
Log.e("mTimeSignalCallback", "onNext: ");
}
}
@Override
@@ -260,6 +274,34 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
});
}
private void setAlarmTime() {
/*Android 10 及以后息屏收不到time_tick广播*/
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(XXOS_ACTION_TIME_TICK);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, TIME_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
long triggerAtTime = getIntervalMillis();
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);
}
}
/**
* @return 获取下个整点的时间戳
*/
private long getIntervalMillis() {
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
Log.e(TAG, "getIntervalMillis: hour = " + hour);
int min = calendar.get(Calendar.MINUTE);
Log.e(TAG, "getIntervalMillis: min = " + min);
calendar.set(Calendar.HOUR_OF_DAY, hour + 1);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
long time = calendar.getTimeInMillis();
Log.e(TAG, "getIntervalMillis: time = " + TimeUtils.transferLongToDate(time));
return time;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: ");
@@ -398,7 +440,7 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
}
// 监听时间和日期变化
public void registerTimeReceiver() {
public void registerTimeChangedReceiver() {
mTimeChangedReceiver = new TimeChangedReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
@@ -406,6 +448,8 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(XXOS_ACTION_TIME_TICK);
filter.addAction(XXOS_ACTION_TIME_CHANGED);
registerReceiver(mTimeChangedReceiver, filter);
}
@@ -415,15 +459,22 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) {
Log.e(TAG, "TimeChangedReceiver:" + "data changed");
} else if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) {
Log.e(TAG, "TimeChangedReceiver:" + "time changed");
} else if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) {
Log.e(TAG, "TimeChangedReceiver:" + "timezone changed");
} else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) {
Log.e(TAG, "TimeChangedReceiver:" + "time tick");
hourlyTimeSignal();
String action = intent.getAction();
Log.e("TimeChangedReceiver", "onReceive: " + action);
switch (action) {
case Intent.ACTION_DATE_CHANGED:
case Intent.ACTION_TIME_CHANGED:
case Intent.ACTION_TIMEZONE_CHANGED:
case XXOS_ACTION_TIME_CHANGED:
setAlarmTime();
break;
case Intent.ACTION_TIME_TICK:
hourlyTimeSignal();
break;
case XXOS_ACTION_TIME_TICK:
alarmWakeup();
break;
default:
}
}
}
@@ -450,7 +501,20 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
}
}
private void registFastCallReceive() {
private void alarmWakeup() {
boolean hourly_time = mMMKV.decodeBool(CommonConfig.HOURLY_TIME_SIGNAL_KEY, false);
if (hourly_time) {
Calendar calendar = Calendar.getInstance();
int hour = calendar.get(Calendar.HOUR_OF_DAY);
Log.e(TAG, "hourlyTimeSignal: hour = " + hour);
mTimeSignalCallback.timeTick(hour);
setAlarmTime();
} else {
Log.e(TAG, "hourlyTimeSignal: not enable hourly time signal");
}
}
private void registerFastCallReceive() {
if (null == mTimeSignalReceiver) {
mTimeSignalReceiver = new TimeSignalReceiver();
}
@@ -728,8 +792,8 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
if (mBallView.isAttachedToWindow()) {
mWindowManager.removeView(mBallView);
}
mMMKV.encode(Float_Window_X, mBallParams.x);
mMMKV.encode(Float_Window_Y, mBallParams.y);
mMMKV.encode(FLOAT_WINDOW_X, mBallParams.x);
mMMKV.encode(FLOAT_WINDOW_Y, mBallParams.y);
}
isBallShown = false;
break;
@@ -789,8 +853,8 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
mBallParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mBallParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// mBallParams.gravity = Gravity.TOP;
int x = mMMKV.decodeInt(Float_Window_X, 360);
int y = mMMKV.decodeInt(Float_Window_Y, -783);
int x = mMMKV.decodeInt(FLOAT_WINDOW_X, 360);
int y = mMMKV.decodeInt(FLOAT_WINDOW_Y, -783);
mBallParams.x = x;
mBallParams.y = y;
mWindowManager.addView(mBallView, mBallParams);
@@ -879,8 +943,8 @@ public class MainService extends BaseRxService implements MainSContact.MainSView
mBallParams.y += tranY;
// 更新悬浮窗位置
mWindowManager.updateViewLayout(mBallView, mBallParams);
mMMKV.encode(Float_Window_X, mBallParams.x);
mMMKV.encode(Float_Window_Y, mBallParams.y);
mMMKV.encode(FLOAT_WINDOW_X, mBallParams.x);
mMMKV.encode(FLOAT_WINDOW_Y, mBallParams.y);
// 记录当前坐标作为下一次计算的上一次移动的位置坐标
lastX = nowX;
lastY = nowY;

View File

@@ -15,9 +15,11 @@ import android.text.TextUtils;
import android.util.Log;
import com.bumptech.glide.Glide;
import com.tencent.mmkv.MMKV;
import com.xxpatx.os.R;
import com.xxpatx.os.bean.Contact;
import com.xxpatx.os.bean.ContactId;
import com.xxpatx.os.config.CommonConfig;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -640,5 +642,34 @@ public class ContactsUtils {
return -1;
}
public static final String NAME = "name";
public static final String NUMBER = "number";
public static List<Contact> getSIMContacts(Context context) {
List<Contact> contactList = new ArrayList<>();
MMKV mmkv = MMKV.mmkvWithID(CommonConfig.MMKV_ID, MMKV.MULTI_PROCESS_MODE);
boolean show_sim = mmkv.decodeInt(CommonConfig.SHOW_SIM_CARD_CONTACT, 0) == 1;
if (!show_sim) {
return contactList;
}
ContentResolver resolver = context.getContentResolver();
// 获取Sims卡联系人
Uri uri = Uri.parse("content://icc/adn");
Cursor phoneCursor = resolver.query(uri, null, null, null, null);
if (phoneCursor != null) {
final int colName = phoneCursor.getColumnIndex(NAME);
final int colNumber = phoneCursor.getColumnIndex(NUMBER);
while (phoneCursor.moveToNext()) {
String number = phoneCursor.getString(colNumber);
// 当手机号码为空的或者为空字段 跳过当前循环
String username = phoneCursor.getString(colName);
Log.e(TAG, "getSIMContacts: number = " + number + " username = " + username);
Contact contact = new Contact(username, number, true);
contactList.add(contact);
}
phoneCursor.close();
}
return contactList;
}
}