Merge remote-tracking branch 'origin/contacts' into appbase
This commit is contained in:
		| @@ -3,7 +3,7 @@ | ||||
| https://github.com/aJIEw/PhoneCallApp.git | ||||
|  | ||||
| #### 介绍 | ||||
| 通讯录与拨号 | ||||
| 这是可以根据正则表达式匹配拦截骚扰电话的手机拨号应用。 | ||||
|  | ||||
| #### 软件架构 | ||||
| 适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。 | ||||
|   | ||||
| @@ -45,9 +45,9 @@ android { | ||||
|  | ||||
| dependencies { | ||||
|     api fileTree(dir: 'libs', include: ['*.jar']) | ||||
|     api 'cc.winboll.studio:libaes:15.8.0' | ||||
|     api 'cc.winboll.studio:libapputils:15.8.1' | ||||
|     api 'cc.winboll.studio:libappbase:15.8.1' | ||||
|     api 'cc.winboll.studio:libaes:15.9.2' | ||||
|     api 'cc.winboll.studio:libapputils:15.8.4' | ||||
|     api 'cc.winboll.studio:libappbase:15.8.4' | ||||
|      | ||||
|     // 权限请求框架:https://github.com/getActivity/XXPermissions | ||||
|     api 'com.github.getActivity:XXPermissions:18.63' | ||||
|   | ||||
| @@ -1,8 +1,8 @@ | ||||
| #Created by .winboll/winboll_app_build.gradle | ||||
| #Tue May 20 13:02:18 HKT 2025 | ||||
| stageCount=3 | ||||
| #Thu Jul 17 09:57:24 HKT 2025 | ||||
| stageCount=12 | ||||
| libraryProject= | ||||
| baseVersion=15.3 | ||||
| publishVersion=15.3.2 | ||||
| publishVersion=15.3.11 | ||||
| buildCount=0 | ||||
| baseBetaVersion=15.3.3 | ||||
| baseBetaVersion=15.3.12 | ||||
|   | ||||
| @@ -79,12 +79,12 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity | ||||
|         APPInfo appInfo = new APPInfo(); | ||||
|         appInfo.setAppName("Contacts"); | ||||
|         appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll); | ||||
|         appInfo.setAppDescription("通讯录与拨号"); | ||||
|         appInfo.setAppGitName("APP"); | ||||
|         appInfo.setAppDescription("这是可以根据正则表达式匹配拦截骚扰电话的手机拨号应用。"); | ||||
|         appInfo.setAppGitName("APPBase"); | ||||
|         appInfo.setAppGitOwner("Studio"); | ||||
|         appInfo.setAppGitAPPBranch(szBranchName); | ||||
|         appInfo.setAppGitAPPSubProjectFolder(szBranchName); | ||||
|         appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=Contacts"); | ||||
|         appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=4&extra=page%3D1"); | ||||
|         appInfo.setAppAPKName("Contacts"); | ||||
|         appInfo.setAppAPKFolderName("Contacts"); | ||||
|         return new AboutView(mContext, appInfo); | ||||
|   | ||||
| @@ -198,6 +198,9 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv | ||||
|             settingsModel.setDunTotalCount(Integer.parseInt(etDunTotalCount.getText().toString())); | ||||
|             settingsModel.setDunResumeSecondCount(Integer.parseInt(etDunResumeSecondCount.getText().toString())); | ||||
|             settingsModel.setDunResumeCount(Integer.parseInt(etDunResumeCount.getText().toString())); | ||||
| 			 | ||||
| 			// 应用效果提示 | ||||
| 			ToastUtils.show((settingsModel.getDunTotalCount() == 1)?"电话骚扰防御力几乎为0。":String.format("以下设置将在连拨%d次后接通电话。", settingsModel.getDunTotalCount())); | ||||
|         } | ||||
|         settingsModel.setIsEnableDun(isEnableDun); | ||||
|         Rules.getInstance(this).saveDun(); | ||||
| @@ -207,6 +210,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv | ||||
|         etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount())); | ||||
|         etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount())); | ||||
|         etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount())); | ||||
| 		 | ||||
|     } | ||||
|  | ||||
|     void updateStreamVolumeTextView() { | ||||
| @@ -243,6 +247,9 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv | ||||
|         Rules.getInstance(this).resetDefaultBoBullToonURL(); | ||||
|         EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et); | ||||
|         etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL()); | ||||
| 		 | ||||
| 		final TomCat tomCat = TomCat.getInstance(this); | ||||
| 		tomCat.cleanBoBullToon(); | ||||
|     } | ||||
|  | ||||
|     public void onDownloadBoBullToon(View view) { | ||||
| @@ -330,4 +337,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv | ||||
|     public void onAbout(View view) { | ||||
|         App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class); | ||||
|     } | ||||
| 	 | ||||
| 	public void onLogView(View view) { | ||||
|         App.getWinBoLLActivityManager().startLogActivity(this); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -5,13 +5,18 @@ package cc.winboll.studio.contacts.adapters; | ||||
|  * @Date 2025/02/26 13:09:32 | ||||
|  * @Describe CallLogAdapter | ||||
|  */ | ||||
| import android.content.ClipData; | ||||
| import android.content.ClipboardManager; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.Button; | ||||
| import android.widget.PopupMenu; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import cc.winboll.studio.contacts.R; | ||||
| @@ -47,6 +52,38 @@ public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogV | ||||
|     public void onBindViewHolder(@NonNull CallLogViewHolder holder, int position) { | ||||
|         final CallLogModel callLog = callLogList.get(position); | ||||
|         holder.phoneNumber.setText(callLog.getPhoneNumber() + "☎" + mContactUtils.getContactsName(callLog.getPhoneNumber())); | ||||
| 		holder.phoneNumber.setOnLongClickListener(new View.OnLongClickListener() { | ||||
| 				@Override | ||||
| 				public boolean onLongClick(View p1) { | ||||
| 					// 弹出复制菜单 | ||||
| 					PopupMenu menu = new PopupMenu(mContext, holder.phoneNumber); | ||||
| 					//加载菜单资源 | ||||
| 					menu.getMenuInflater().inflate(R.menu.toolbar_calllog_phonenumber, menu.getMenu()); | ||||
| 					//设置点击事件的响应 | ||||
| 					menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { | ||||
| 							@Override | ||||
| 							public boolean onMenuItemClick(MenuItem menuItem) { | ||||
| 								int nItemId = menuItem.getItemId(); | ||||
| 								if (nItemId == R.id.item_calllog_phonenumber_copy) { | ||||
| 									// Gets a handle to the clipboard service. | ||||
| 									ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); | ||||
| 									// Creates a new text clip to put on the clipboard | ||||
| 									ClipData clip = ClipData.newPlainText("simple text", callLog.getPhoneNumber()); | ||||
| 									// Set the clipboard's primary clip. | ||||
| 									clipboard.setPrimaryClip(clip); | ||||
| 									Toast.makeText(mContext, "Copy to clipboard.", Toast.LENGTH_SHORT).show(); | ||||
| 								} | ||||
|  | ||||
| 								return true; | ||||
| 							} | ||||
| 						}); | ||||
| 					//一定要调用show()来显示弹出式菜单 | ||||
| 					menu.show(); | ||||
|  | ||||
| 					return true; | ||||
| 				} | ||||
| 			}); | ||||
| 		 | ||||
|         holder.callStatus.setText(callLog.getCallStatus()); | ||||
|         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); | ||||
|         holder.callDate.setText(dateFormat.format(callLog.getCallDate())); | ||||
|   | ||||
| @@ -5,19 +5,25 @@ package cc.winboll.studio.contacts.adapters; | ||||
|  * @Date 2025/02/26 13:35:44 | ||||
|  * @Describe ContactAdapter | ||||
|  */ | ||||
| import android.content.ClipData; | ||||
| import android.content.ClipboardManager; | ||||
| import android.content.Context; | ||||
| import android.content.Intent; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.Button; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.PopupMenu; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| import cc.winboll.studio.contacts.R; | ||||
| import cc.winboll.studio.contacts.beans.ContactModel; | ||||
| import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import java.util.List; | ||||
| import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; | ||||
|  | ||||
| public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> { | ||||
|  | ||||
| @@ -26,8 +32,10 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV | ||||
|     private static final int REQUEST_CALL_PHONE = 1; | ||||
|  | ||||
|     private List<ContactModel> contactList; | ||||
| 	Context mContext; | ||||
|  | ||||
|     public ContactAdapter(List<ContactModel> contactList) { | ||||
|     public ContactAdapter(Context context, List<ContactModel> contactList) { | ||||
| 		mContext = context; | ||||
|         this.contactList = contactList; | ||||
|     } | ||||
|  | ||||
| @@ -41,6 +49,37 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV | ||||
|     @Override | ||||
|     public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) { | ||||
|         final ContactModel contact = contactList.get(position); | ||||
| 		holder.llPhoneNumberMain.setOnLongClickListener(new View.OnLongClickListener() { | ||||
| 				@Override | ||||
| 				public boolean onLongClick(View p1) { | ||||
| 					// 弹出复制菜单 | ||||
| 					PopupMenu menu = new PopupMenu(mContext, holder.llPhoneNumberMain); | ||||
| 					//加载菜单资源 | ||||
| 					menu.getMenuInflater().inflate(R.menu.toolbar_contact_phonenumber, menu.getMenu()); | ||||
| 					//设置点击事件的响应 | ||||
| 					menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { | ||||
| 							@Override | ||||
| 							public boolean onMenuItemClick(MenuItem menuItem) { | ||||
| 								int nItemId = menuItem.getItemId(); | ||||
| 								if (nItemId == R.id.item_contact_phonenumber_copy) { | ||||
| 									// Gets a handle to the clipboard service. | ||||
| 									ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE); | ||||
| 									// Creates a new text clip to put on the clipboard | ||||
| 									ClipData clip = ClipData.newPlainText("simple text", contact.getNumber()); | ||||
| 									// Set the clipboard's primary clip. | ||||
| 									clipboard.setPrimaryClip(clip); | ||||
| 									Toast.makeText(mContext, "Copy to clipboard.", Toast.LENGTH_SHORT).show(); | ||||
| 								} | ||||
|  | ||||
| 								return true; | ||||
| 							} | ||||
| 						}); | ||||
| 					//一定要调用show()来显示弹出式菜单 | ||||
| 					menu.show(); | ||||
|  | ||||
| 					return true; | ||||
| 				} | ||||
| 			}); | ||||
|         holder.contactName.setText(contact.getName()); | ||||
|         holder.contactNumber.setText(contact.getNumber()); | ||||
|  | ||||
| @@ -69,12 +108,14 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV | ||||
|     } | ||||
|  | ||||
|     public class ContactViewHolder extends RecyclerView.ViewHolder { | ||||
| 		LinearLayout llPhoneNumberMain; | ||||
|         TextView contactName; | ||||
|         TextView contactNumber; | ||||
|         AOHPCTCSeekBar dialAOHPCTCSeekBar; | ||||
|          | ||||
|         public ContactViewHolder(@NonNull View itemView) { | ||||
|             super(itemView); | ||||
| 			llPhoneNumberMain = itemView.findViewById(R.id.itemcontactLinearLayout1); | ||||
|             contactName = itemView.findViewById(R.id.contact_name); | ||||
|             contactNumber = itemView.findViewById(R.id.contact_number); | ||||
|             dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial); | ||||
|   | ||||
| @@ -7,6 +7,7 @@ package cc.winboll.studio.contacts.adapters; | ||||
|  */ | ||||
| import android.content.Context; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.MotionEvent; | ||||
| import android.view.View; | ||||
| import android.view.ViewGroup; | ||||
| import android.widget.Button; | ||||
| @@ -20,6 +21,7 @@ import cc.winboll.studio.contacts.R; | ||||
| import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel; | ||||
| import cc.winboll.studio.contacts.dun.Rules; | ||||
| import cc.winboll.studio.contacts.views.LeftScrollView; | ||||
| import cc.winboll.studio.libappbase.LogUtils; | ||||
| import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog; | ||||
| import com.hjq.toast.ToastUtils; | ||||
| import java.util.ArrayList; | ||||
| @@ -60,6 +62,10 @@ public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.V | ||||
|             final SimpleViewHolder simpleViewHolder = (SimpleViewHolder) holder; | ||||
|             String szView = model.getRuleText().trim().equals("") ?"[NULL]": model.getRuleText(); | ||||
|             simpleViewHolder.tvRuleText.setText(szView); | ||||
|             simpleViewHolder.checkBoxAllow.setChecked(model.isAllowConnection()); | ||||
| 			simpleViewHolder.checkBoxAllow.setEnabled(false); | ||||
|             simpleViewHolder.checkBoxEnable.setChecked(model.isEnable()); | ||||
| 			simpleViewHolder.checkBoxEnable.setEnabled(false); | ||||
|             simpleViewHolder.scrollView.setOnActionListener(new LeftScrollView.OnActionListener(){ | ||||
|  | ||||
|                     @Override | ||||
| @@ -215,16 +221,22 @@ public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.V | ||||
|  | ||||
|         private final LeftScrollView scrollView; | ||||
|         private final TextView tvRuleText; | ||||
| 		CheckBox checkBoxAllow; | ||||
|         CheckBox checkBoxEnable; | ||||
|  | ||||
|  | ||||
|         public SimpleViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) { | ||||
|             super(itemView); | ||||
|             scrollView = itemView.findViewById(R.id.scrollView); | ||||
|             //tvRuleText = itemView.findViewById(R.id.ruletext_tv); | ||||
|             tvRuleText = new TextView(itemView.getContext()); | ||||
| 			LayoutInflater inflater = LayoutInflater.from(itemView.getContext()); | ||||
| 		    View viewContent = inflater.inflate(R.layout.view_phone_connect_rule_simple_content, parent, false); | ||||
|             tvRuleText = viewContent.findViewById(R.id.ruletext_tv); | ||||
|             checkBoxAllow = viewContent.findViewById(R.id.checkbox_allow); | ||||
|             checkBoxEnable = viewContent.findViewById(R.id.checkbox_enable); | ||||
|             //tvRuleText = new TextView(itemView.getContext()); | ||||
|             scrollView.setContentWidth(parent.getWidth()); | ||||
|             //scrollView.setContentWidth(600); | ||||
|             scrollView.addContentLayout(tvRuleText); | ||||
|             scrollView.addContentLayout(viewContent); | ||||
|         } | ||||
|  | ||||
|     } | ||||
| @@ -243,5 +255,9 @@ public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.V | ||||
|             buttonConfirm = itemView.findViewById(R.id.button_confirm); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| 	private void setCheckBoxTouchListener(CheckBox checkBox) { | ||||
|  | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -155,6 +155,19 @@ public class TomCat { | ||||
|         return mContext.getExternalFilesDir(TAG); | ||||
|     } | ||||
|  | ||||
| 	public void cleanBoBullToon() { | ||||
| 		String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径 | ||||
| 		// 删除旧文件 | ||||
| 		File fOldFolder = new File(destinationFolder); | ||||
| 		if (fOldFolder.exists()) { | ||||
| 			deleteFolderRecursive(fOldFolder); | ||||
| 			fOldFolder.mkdirs(); | ||||
| 		} | ||||
|  | ||||
| 		ToastUtils.show("已清空 BoBullToon 数据!"); | ||||
| 		LogUtils.d(TAG, "已清空 BoBullToon 数据"); | ||||
| 	} | ||||
|  | ||||
|     public boolean loadPhoneBoBullToon() { | ||||
|         listPhoneBoBullToon.clear(); | ||||
|         File fBoBullToon = new File(getWorkingFolder(), "bobulltoon"); | ||||
|   | ||||
| @@ -145,6 +145,14 @@ public class Rules { | ||||
|             LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect)); | ||||
|         } | ||||
|  | ||||
|         // 检验拨不通号码群 | ||||
|         if (!isDefend && MainService.isPhoneInBoBullToon(phoneNumber)) { | ||||
|             LogUtils.d(TAG, String.format("PhoneNumber %s\n Is In BoBullToon", phoneNumber)); | ||||
|             isDefend = true; | ||||
|             isConnect = false; | ||||
|             LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect)); | ||||
|         } | ||||
|  | ||||
|         // 查询通讯录是否有该联系人 | ||||
|         boolean isPhoneInContacts = ContactUtils.getInstance(mContext).isPhoneInContacts(mContext, phoneNumber); | ||||
|         if (!isDefend) { | ||||
| @@ -158,14 +166,6 @@ public class Rules { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // 检验拨不通号码群 | ||||
|         if (!isDefend && MainService.isPhoneInBoBullToon(phoneNumber)) { | ||||
|             LogUtils.d(TAG, String.format("PhoneNumber %s\n Is In BoBullToon", phoneNumber)); | ||||
|             isDefend = true; | ||||
|             isConnect = false; | ||||
|             LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect)); | ||||
|         } | ||||
|  | ||||
|         // 正则匹配规则名单校验 | ||||
|         if (!isDefend) { | ||||
|             for (int i = 0; i < _PhoneConnectRuleModelList.size(); i++) { | ||||
|   | ||||
| @@ -73,7 +73,7 @@ public class ContactsFragment extends Fragment { | ||||
|         super.onViewCreated(view, savedInstanceState); | ||||
|         recyclerView = view.findViewById(R.id.contacts_recycler_view); | ||||
|         recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); | ||||
|         contactAdapter = new ContactAdapter(contactList); | ||||
|         contactAdapter = new ContactAdapter(getContext(), contactList); | ||||
|         recyclerView.setAdapter(contactAdapter); | ||||
|  | ||||
|         searchEditText = view.findViewById(R.id.search_edit_text); | ||||
|   | ||||
| @@ -47,8 +47,8 @@ public class LeftScrollView extends HorizontalScrollView { | ||||
|         init(); | ||||
|     } | ||||
|  | ||||
|     public void addContentLayout(TextView textView) { | ||||
|         contentLayout.addView(textView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); | ||||
|     public void addContentLayout(View viewContent) { | ||||
|         contentLayout.addView(viewContent, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); | ||||
|     } | ||||
|  | ||||
|     public void setContentWidth(int contentWidth) { | ||||
|   | ||||
| @@ -269,6 +269,19 @@ | ||||
|  | ||||
| 			</LinearLayout> | ||||
|  | ||||
| 			<LinearLayout | ||||
| 				android:orientation="horizontal" | ||||
| 				android:layout_width="match_parent" | ||||
| 				android:layout_height="wrap_content" | ||||
| 				android:gravity="center_horizontal"> | ||||
|  | ||||
| 				<TextView | ||||
| 					android:layout_width="wrap_content" | ||||
| 					android:layout_height="wrap_content" | ||||
| 					android:text="<<==向左拉动列表项可编辑内容"/> | ||||
|  | ||||
| 			</LinearLayout> | ||||
|  | ||||
| 			<androidx.recyclerview.widget.RecyclerView | ||||
| 				android:id="@+id/recycler_view" | ||||
| 				android:layout_width="match_parent" | ||||
| @@ -287,6 +300,12 @@ | ||||
| 				android:layout_height="wrap_content" | ||||
| 				android:gravity="right"> | ||||
|  | ||||
| 				<Button | ||||
| 					android:layout_width="wrap_content" | ||||
| 					android:layout_height="wrap_content" | ||||
| 					android:text="LogView" | ||||
| 					android:onClick="onLogView"/> | ||||
|  | ||||
| 				<Button | ||||
| 					android:layout_width="wrap_content" | ||||
| 					android:layout_height="wrap_content" | ||||
|   | ||||
| @@ -15,8 +15,10 @@ | ||||
| 		<Button | ||||
| 			android:layout_width="wrap_content" | ||||
| 			android:layout_height="wrap_content" | ||||
| 			android:text="Test Main" | ||||
| 			android:onClick="onTestMain"/> | ||||
| 			android:text="Add Demo Rules(While size is 0) and Test" | ||||
| 			android:onClick="onTestMain" | ||||
| 			android:textSize="10sp" | ||||
| 			android:textAllCaps="false"/> | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
| @@ -43,7 +45,8 @@ | ||||
| 			android:layout_width="wrap_content" | ||||
| 			android:layout_height="wrap_content" | ||||
| 			android:text="Test Phone" | ||||
| 			android:onClick="onTestPhone"/> | ||||
| 			android:onClick="onTestPhone" | ||||
| 			android:textAllCaps="false"/> | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
|   | ||||
| @@ -9,7 +9,8 @@ | ||||
| 	<LinearLayout | ||||
| 		android:orientation="horizontal" | ||||
| 		android:layout_width="match_parent" | ||||
| 		android:layout_height="wrap_content"> | ||||
| 		android:layout_height="wrap_content" | ||||
| 		android:id="@+id/itemcontactLinearLayout1"> | ||||
|  | ||||
| 		<TextView | ||||
| 			android:id="@+id/contact_number" | ||||
|   | ||||
| @@ -23,7 +23,7 @@ | ||||
| 			android:id="@+id/checkbox_allow" | ||||
| 			android:layout_width="wrap_content" | ||||
| 			android:layout_height="wrap_content" | ||||
| 			android:text="允许连接"/> | ||||
| 			android:text="连接"/> | ||||
|  | ||||
|         <CheckBox | ||||
|             android:id="@+id/checkbox_enable" | ||||
|   | ||||
| @@ -1,55 +0,0 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <HorizontalScrollView | ||||
|     xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
| 	android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content" | ||||
|     android:scrollbars="none" | ||||
|     android:id="@+id/scrollView"> | ||||
|  | ||||
|     <LinearLayout | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:orientation="horizontal"> | ||||
|  | ||||
|         <!-- 内容区域 --> | ||||
|         <LinearLayout | ||||
|             android:id="@+id/content_layout" | ||||
|             android:layout_width="match_parent" | ||||
|             android:layout_height="wrap_content" | ||||
|             android:padding="16dp" | ||||
|             android:background="@color/white"> | ||||
|             <!-- 这里放置你的列表项内容 --> | ||||
|  | ||||
|             <TextView | ||||
|                 android:id="@+id/text_view" | ||||
|                 android:layout_width="0dp" | ||||
|                 android:layout_height="wrap_content" | ||||
|                 android:layout_weight="1" | ||||
|                 android:textSize="16sp"/> | ||||
|         </LinearLayout> | ||||
|  | ||||
|         <!-- 操作按钮 --> | ||||
|         <LinearLayout | ||||
|             android:id="@+id/action_layout" | ||||
|             android:layout_width="wrap_content" | ||||
|             android:layout_height="match_parent" | ||||
|             android:orientation="horizontal" | ||||
|             android:background="@color/lightgray"> | ||||
|  | ||||
|             <Button | ||||
|                 android:id="@+id/edit_btn" | ||||
|                 android:layout_width="80dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:text="编辑" | ||||
|                 android:background="@color/blue" /> | ||||
|  | ||||
|             <Button | ||||
|                 android:id="@+id/delete_btn" | ||||
|                 android:layout_width="80dp" | ||||
|                 android:layout_height="match_parent" | ||||
|                 android:text="删除" | ||||
|                 android:background="@color/red" /> | ||||
|         </LinearLayout> | ||||
|     </LinearLayout> | ||||
| </HorizontalScrollView> | ||||
| @@ -0,0 +1,35 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <LinearLayout | ||||
| 	xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| 	xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
| 	android:orientation="horizontal" | ||||
| 	android:layout_width="match_parent" | ||||
| 	android:layout_height="wrap_content" | ||||
| 	android:layout_gravity="center_vertical" | ||||
| 	android:gravity="center_vertical"> | ||||
|  | ||||
| 	<TextView | ||||
| 		android:layout_width="wrap_content" | ||||
| 		android:layout_height="wrap_content" | ||||
| 		android:text="Text" | ||||
| 		android:layout_weight="1.0" | ||||
| 		android:id="@+id/ruletext_tv"/> | ||||
|  | ||||
| 	<CheckBox | ||||
| 		android:id="@+id/checkbox_allow" | ||||
| 		android:layout_width="wrap_content" | ||||
| 		android:layout_height="wrap_content" | ||||
| 		android:text="连接" | ||||
| 		android:clickable="false" | ||||
| 		android:focusable="false"/> | ||||
|  | ||||
| 	<CheckBox | ||||
| 		android:id="@+id/checkbox_enable" | ||||
| 		android:layout_width="wrap_content" | ||||
| 		android:layout_height="wrap_content" | ||||
| 		android:text="启用" | ||||
| 		android:clickable="false" | ||||
| 		android:focusable="false"/> | ||||
|  | ||||
| </LinearLayout> | ||||
|  | ||||
| @@ -0,0 +1,9 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| 	xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|      | ||||
|     <item | ||||
|         android:id="@+id/item_calllog_phonenumber_copy" | ||||
|         android:title="Copy"/> | ||||
|      | ||||
| </menu> | ||||
| @@ -0,0 +1,9 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | ||||
| 	xmlns:app="http://schemas.android.com/apk/res-auto"> | ||||
|  | ||||
|     <item | ||||
|         android:id="@+id/item_contact_phonenumber_copy" | ||||
|         android:title="Copy"/> | ||||
|      | ||||
| </menu> | ||||
| @@ -2,6 +2,6 @@ | ||||
| <resources> | ||||
|  | ||||
|     <string name="app_name">Contacts</string> | ||||
|     <string name="default_bobulltoon_url">http://10.8.0.12:3000/Studio/BoBullToon/archive/main.zip</string> | ||||
|     <string name="default_bobulltoon_url">https://gitea.winboll.cc/Studio/BoBullToon/archive/main.zip</string> | ||||
|  | ||||
| </resources> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen