version:1.4.8
fix:修复一键拨号 update:增加sim卡显示
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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";
|
||||
|
||||
/*后台设置的*/
|
||||
/*主页按钮开关*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user