设置UI为拖动拨号方式

This commit is contained in:
ZhanGSKen 2025-03-08 04:36:07 +08:00
parent 02f2d4f0bc
commit 5779f195f8
12 changed files with 124 additions and 65 deletions

View File

@ -41,29 +41,41 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
} }
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
} }
dependencies { dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.squareup.okhttp3:okhttp:4.4.1'
// https://github.com/getActivity/XXPermissions
implementation 'com.github.getActivity:XXPermissions:18.63'
//
implementation 'com.baoyz.pullrefreshlayout:library:1.2.0'
//
// https://mvnrepository.com/artifact/com.github.open-android/pinyin4j // https://mvnrepository.com/artifact/com.github.open-android/pinyin4j
implementation 'com.github.open-android:pinyin4j:2.5.0' implementation 'com.github.open-android:pinyin4j:2.5.0'
// SSH
implementation 'com.jcraft:jsch:0.1.55'
// Html
implementation 'org.jsoup:jsoup:1.13.1'
//
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
//
implementation 'io.github.medyo:android-about-page:2.0.0' implementation 'io.github.medyo:android-about-page:2.0.0'
//
implementation 'com.github.getActivity:ToastUtils:10.5' implementation 'com.github.getActivity:ToastUtils:10.5'
//
implementation 'com.squareup.okhttp3:okhttp:4.4.1'
// Android
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.viewpager:viewpager:1.0.0' implementation 'androidx.viewpager:viewpager:1.0.0'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
implementation 'androidx.fragment:fragment:1.1.0' implementation 'androidx.fragment:fragment:1.1.0'
implementation 'com.google.android.material:material:1.4.0' implementation 'com.google.android.material:material:1.4.0'
implementation 'cc.winboll.studio:libapputils:9.3.2' implementation 'cc.winboll.studio:libappbase:2.1.3'
implementation 'cc.winboll.studio:libappbase:1.5.6' implementation 'cc.winboll.studio:libapputils:9.4.2'
implementation 'cc.winboll.studio:libaes:7.6.6'
} }

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Thu Mar 06 21:44:44 HKT 2025 #Fri Mar 07 20:34:32 GMT 2025
stageCount=13 stageCount=13
libraryProject= libraryProject=
baseVersion=1.0 baseVersion=1.0
publishVersion=1.0.12 publishVersion=1.0.12
buildCount=0 buildCount=2
baseBetaVersion=1.0.13 baseBetaVersion=1.0.13

View File

@ -35,9 +35,7 @@ import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.libappbase.LogView;
import cc.winboll.studio.libapputils.app.IWinBollActivity; import cc.winboll.studio.libapputils.app.IWinBollActivity;
import cc.winboll.studio.libapputils.app.WinBollActivityManager;
import cc.winboll.studio.libapputils.bean.APPInfo; import cc.winboll.studio.libapputils.bean.APPInfo;
import cc.winboll.studio.libapputils.view.YesNoAlertDialog;
import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -29,17 +29,17 @@ import cc.winboll.studio.contacts.adapters.PhoneConnectRuleAdapter;
import cc.winboll.studio.contacts.beans.MainServiceBean; import cc.winboll.studio.contacts.beans.MainServiceBean;
import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel; import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel;
import cc.winboll.studio.contacts.beans.RingTongBean; import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.contacts.beans.SettingsModel;
import cc.winboll.studio.contacts.bobulltoon.TomCat; import cc.winboll.studio.contacts.bobulltoon.TomCat;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.libappbase.IWinBollActivity; import cc.winboll.studio.contacts.views.DuInfoTextView;
import cc.winboll.studio.libappbase.bean.APPInfo; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libapputils.app.IWinBollActivity;
import cc.winboll.studio.libapputils.bean.APPInfo;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;
import cc.winboll.studio.contacts.beans.SettingsModel;
import cc.winboll.studio.contacts.views.DuInfoTextView;
import cc.winboll.studio.libappbase.LogUtils;
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity { public class SettingsActivity extends AppCompatActivity implements IWinBollActivity {

View File

@ -5,10 +5,8 @@ package cc.winboll.studio.contacts.adapters;
* @Date 2025/02/26 13:09:32 * @Date 2025/02/26 13:09:32
* @Describe CallLogAdapter * @Describe CallLogAdapter
*/ */
import android.content.ContentResolver; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -18,15 +16,12 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.CallLogModel; import cc.winboll.studio.contacts.beans.CallLogModel;
import cc.winboll.studio.contacts.utils.ContactUtils;
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
import cc.winboll.studio.contacts.utils.ContactUtils;
import android.content.Context;
public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogViewHolder> { public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogViewHolder> {
public static final String TAG = "CallLogAdapter"; public static final String TAG = "CallLogAdapter";
@ -34,7 +29,7 @@ public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogV
private List<CallLogModel> callLogList; private List<CallLogModel> callLogList;
ContactUtils mContactUtils; ContactUtils mContactUtils;
Context mContext; Context mContext;
public CallLogAdapter(Context context, List<CallLogModel> callLogList) { public CallLogAdapter(Context context, List<CallLogModel> callLogList) {
mContext = context; mContext = context;
this.mContactUtils = ContactUtils.getInstance(mContext); this.mContactUtils = ContactUtils.getInstance(mContext);
@ -55,9 +50,14 @@ public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogV
holder.callStatus.setText(callLog.getCallStatus()); holder.callStatus.setText(callLog.getCallStatus());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
holder.callDate.setText(dateFormat.format(callLog.getCallDate())); holder.callDate.setText(dateFormat.format(callLog.getCallDate()));
holder.dialButton.setOnClickListener(new View.OnClickListener() {
// 初始化拉动后拨号控件
holder.dialAOHPCTCSeekBar.setThumb(holder.itemView.getContext().getDrawable(R.drawable.ic_call));
holder.dialAOHPCTCSeekBar.setThumbOffset(20);
holder.dialAOHPCTCSeekBar.setOnOHPCListener(
new AOHPCTCSeekBar.OnOHPCListener(){
@Override @Override
public void onClick(View v) { public void onOHPCommit() {
String phoneNumber = callLog.getPhoneNumber().replaceAll("\\s", ""); String phoneNumber = callLog.getPhoneNumber().replaceAll("\\s", "");
ToastUtils.show(phoneNumber); ToastUtils.show(phoneNumber);
Intent intent = new Intent(Intent.ACTION_CALL); Intent intent = new Intent(Intent.ACTION_CALL);
@ -77,16 +77,16 @@ public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogV
public class CallLogViewHolder extends RecyclerView.ViewHolder { public class CallLogViewHolder extends RecyclerView.ViewHolder {
TextView phoneNumber, callStatus, callDate; TextView phoneNumber, callStatus, callDate;
Button dialButton; Button dialButton;
AOHPCTCSeekBar dialAOHPCTCSeekBar;
public CallLogViewHolder(@NonNull View itemView) { public CallLogViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
phoneNumber = itemView.findViewById(R.id.phone_number); phoneNumber = itemView.findViewById(R.id.phone_number);
callStatus = itemView.findViewById(R.id.call_status); callStatus = itemView.findViewById(R.id.call_status);
callDate = itemView.findViewById(R.id.call_date); callDate = itemView.findViewById(R.id.call_date);
dialButton = itemView.findViewById(R.id.dial_button); dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial);
} }
} }
} }

View File

@ -17,6 +17,7 @@ import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.ContactModel; import cc.winboll.studio.contacts.beans.ContactModel;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.util.List; import java.util.List;
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> { public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
@ -43,9 +44,13 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV
holder.contactName.setText(contact.getName()); holder.contactName.setText(contact.getName());
holder.contactNumber.setText(contact.getNumber()); holder.contactNumber.setText(contact.getNumber());
holder.dialButton.setOnClickListener(new View.OnClickListener() { // 初始化拉动后拨号控件
holder.dialAOHPCTCSeekBar.setThumb(holder.itemView.getContext().getDrawable(R.drawable.ic_call));
holder.dialAOHPCTCSeekBar.setThumbOffset(20);
holder.dialAOHPCTCSeekBar.setOnOHPCListener(
new AOHPCTCSeekBar.OnOHPCListener(){
@Override @Override
public void onClick(View v) { public void onOHPCommit() {
String phoneNumber = contact.getNumber().replaceAll("\\s", ""); String phoneNumber = contact.getNumber().replaceAll("\\s", "");
ToastUtils.show(phoneNumber); ToastUtils.show(phoneNumber);
Intent intent = new Intent(Intent.ACTION_CALL); Intent intent = new Intent(Intent.ACTION_CALL);
@ -65,13 +70,13 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV
public class ContactViewHolder extends RecyclerView.ViewHolder { public class ContactViewHolder extends RecyclerView.ViewHolder {
TextView contactName; TextView contactName;
TextView contactNumber; TextView contactNumber;
Button dialButton; AOHPCTCSeekBar dialAOHPCTCSeekBar;
public ContactViewHolder(@NonNull View itemView) { public ContactViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
contactName = itemView.findViewById(R.id.contact_name); contactName = itemView.findViewById(R.id.contact_name);
contactNumber = itemView.findViewById(R.id.contact_number); contactNumber = itemView.findViewById(R.id.contact_number);
dialButton = itemView.findViewById(R.id.dial_button); dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial);
} }
} }
} }

View File

@ -20,6 +20,7 @@ import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
import cc.winboll.studio.contacts.beans.MainServiceBean; import cc.winboll.studio.contacts.beans.MainServiceBean;
import cc.winboll.studio.contacts.beans.RingTongBean; import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.contacts.bobulltoon.TomCat;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import cc.winboll.studio.contacts.handlers.MainServiceHandler; import cc.winboll.studio.contacts.handlers.MainServiceHandler;
import cc.winboll.studio.contacts.listenphonecall.CallListenerService; import cc.winboll.studio.contacts.listenphonecall.CallListenerService;
@ -27,11 +28,12 @@ import cc.winboll.studio.contacts.receivers.MainReceiver;
import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.contacts.threads.MainServiceThread; import cc.winboll.studio.contacts.threads.MainServiceThread;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.SOS; import cc.winboll.studio.libappbase.sos.SOS;
import cc.winboll.studio.libappbase.bean.APPSOSBean;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import cc.winboll.studio.contacts.bobulltoon.TomCat; import cc.winboll.studio.libappbase.sos.WinBoll;
import cc.winboll.studio.contacts.App;
import cc.winboll.studio.libappbase.sos.APPModel;
public class MainService extends Service { public class MainService extends Service {
@ -128,7 +130,11 @@ public class MainService extends Service {
// 唤醒守护进程 // 唤醒守护进程
wakeupAndBindAssistant(); wakeupAndBindAssistant();
// 召唤 WinBoll APP 绑定本服务 // 召唤 WinBoll APP 绑定本服务
SOS.bindToAPPService(this, new APPSOSBean(getPackageName(), MainService.class.getName())); if (App.isDebuging()) {
WinBoll.bindToAPPBaseBeta(this, MainService.class.getName());
} else {
WinBoll.bindToAPPBase(this, MainService.class.getName());
}
// 初始化服务运行参数 // 初始化服务运行参数
_TomCat = TomCat.getInstance(this); _TomCat = TomCat.getInstance(this);
@ -234,7 +240,11 @@ public class MainService extends Service {
if (mMainServiceBean.isEnable()) { if (mMainServiceBean.isEnable()) {
// 唤醒守护进程 // 唤醒守护进程
wakeupAndBindAssistant(); wakeupAndBindAssistant();
SOS.sosWinBollService(getApplicationContext(), new APPSOSBean(getPackageName(), MainService.class.getName())); if (App.isDebuging()) {
SOS.sosToAppBase(getApplicationContext(), MainService.class.getName());
} else {
SOS.sosToAppBaseBeta(getApplicationContext(), MainService.class.getName());
}
} }
isBound = false; isBound = false;
mAssistantService = null; mAssistantService = null;
@ -296,7 +306,7 @@ public class MainService extends Service {
LogUtils.d(TAG, "已重启 MainService"); LogUtils.d(TAG, "已重启 MainService");
} }
} }
public static void stopMainServiceAndSaveStatus(Context context) { public static void stopMainServiceAndSaveStatus(Context context) {
LogUtils.d(TAG, "stopMainServiceAndSaveStatus"); LogUtils.d(TAG, "stopMainServiceAndSaveStatus");
MainServiceBean bean = new MainServiceBean(); MainServiceBean bean = new MainServiceBean();

View File

@ -6,11 +6,7 @@ package cc.winboll.studio.contacts.threads;
*/ */
import android.content.Context; import android.content.Context;
import cc.winboll.studio.contacts.handlers.MainServiceHandler; import cc.winboll.studio.contacts.handlers.MainServiceHandler;
import cc.winboll.studio.contacts.services.MainService;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.SOS;
import cc.winboll.studio.libappbase.bean.APPSOSBean;
import com.hjq.toast.ToastUtils;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
public class MainServiceThread extends Thread { public class MainServiceThread extends Thread {

View File

@ -44,7 +44,7 @@ public class ContactUtils {
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//Map<String, String> contactMap = new HashMap<>(); //Map<String, String> contactMap = new HashMap<>();
contactMap.put(getSimplePhone(phoneNumber), displayName); contactMap.put(formatToSimplePhoneNumber(phoneNumber), displayName);
} }
cursor.close(); cursor.close();
} }
@ -52,11 +52,42 @@ public class ContactUtils {
} }
public String getContactsName(String phone) { public String getContactsName(String phone) {
String result = contactMap.get(getSimplePhone(phone)); String result = contactMap.get(formatToSimplePhoneNumber(phone));
return result == null ? "[NoInContacts]" : result; return result == null ? "[NoInContacts]" : result;
} }
static String getSimplePhone(String phone) { // static String getSimplePhone(String phone) {
return phone.replaceAll("[+\\s]", ""); // return phone.replaceAll("[+\\s]", "");
// }
public static String formatToSimplePhoneNumber(String number) {
// 去除所有空格和非数字字符
return number.replaceAll("[^0-9]", "");
}
public static String getDisplayNameByPhone(Context context, String phoneNumber) {
String displayName = null;
ContentResolver resolver = context.getContentResolver();
String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};
Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{formatToSimplePhoneNumber(phoneNumber)}, null);
if (cursor!= null && cursor.moveToFirst()) {
displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
cursor.close();
}
return displayName;
}
public static String formatToSpacePhoneNumber(String simpleNumber) {
// 去除所有空格和非数字字符
StringBuilder sbSpaceNumber = new StringBuilder();
String regex = "^1[0-9]{10}$";
if(simpleNumber.matches(regex)) {
sbSpaceNumber.append(simpleNumber.substring(0,2));
sbSpaceNumber.append(" ");
sbSpaceNumber.append(simpleNumber.substring(3,6));
sbSpaceNumber.append(" ");
sbSpaceNumber.append(simpleNumber.substring(7,10));
}
return sbSpaceNumber.toString();
} }
} }

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#ff000000"
android:pathData="M6.62,10.79C8.06,13.62 10.38,15.94 13.21,17.38L15.41,15.18C15.69,14.9 16.08,14.82 16.43,14.93C17.55,15.3 18.75,15.5 20,15.5A1,1 0,0 1,21 16.5V20A1,1 0,0 1,20 21A17,17 0,0 1,3 4A1,1 0,0 1,4 3H7.5A1,1 0,0 1,8.5 4C8.5,5.25 8.7,6.45 9.07,7.57C9.18,7.92 9.1,8.31 8.82,8.59L6.62,10.79Z"/>
</vector>

View File

@ -3,13 +3,13 @@
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
android:padding="16dp"> android:padding="16dp">
<TextView <TextView
android:id="@+id/phone_number" android:id="@+id/phone_number"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="bold" /> android:textStyle="bold" />
@ -28,12 +28,10 @@
android:textSize="14sp" android:textSize="14sp"
android:layout_marginTop="4dp" /> android:layout_marginTop="4dp" />
<Button <cc.winboll.studio.libaes.views.AOHPCTCSeekBar
android:id="@+id/dial_button" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Dial" android:id="@+id/aohpctcseekbar_dial"/>
android:layout_marginTop="8dp"/>
</LinearLayout> </LinearLayout>

View File

@ -20,12 +20,10 @@
android:textSize="14sp" android:textSize="14sp"
android:layout_marginTop="4dp"/> android:layout_marginTop="4dp"/>
<Button <cc.winboll.studio.libaes.views.AOHPCTCSeekBar
android:id="@+id/dial_button" android:layout_width="match_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Dial" android:id="@+id/aohpctcseekbar_dial"/>
android:layout_marginTop="8dp"/>
</LinearLayout> </LinearLayout>