package com.shlb.comb.activity; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Color; import android.os.Build; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import com.blakequ.bluetooth_manager_lib.scan.BluetoothScanManager; import com.blakequ.bluetooth_manager_lib.util.BluetoothUtils; import com.qmuiteam.qmui.widget.dialog.QMUIDialog; import com.shlb.comb.R; import com.shlb.comb.base.BaseActivity; import com.shlb.comb.event.UpdateEvent; import com.shlb.comb.fragment.DeviceListFragment; import com.shlb.comb.fragment.SettingsFragment; import com.shlb.comb.manager.BleGlobalManager; import com.shlb.comb.model.BluetoothLeDeviceStore; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; public class HomeActivity extends BaseActivity implements AdapterView.OnItemClickListener { private DrawerLayout drawerLayout; protected TextView tv_scan; private long lastScanClickTime = 0; // 用于节流 // Bluetooth Variables private BluetoothScanManager scanManager; private BluetoothLeDeviceStore mDeviceStore; private BluetoothUtils mBluetoothUtils; private SettingsFragment settingsFragment; private DeviceListFragment deviceListFragment; @Override protected void contentView() { setContentView(R.layout.activity_home); drawerLayout = findViewById(R.id.drawer_layout); // 设置全屏,使抽屉可以覆盖状态栏和导航栏 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.TRANSPARENT); window.setNavigationBarColor(Color.TRANSPARENT); } } @Override protected void initView() { super.initHead(); tv_scan = findViewById(R.id.tv_scan); try { TextView tvVersion = findViewById(R.id.tv_version); if (tvVersion != null) { String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName; tvVersion.setText("Version " + versionName); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } initTitlebar(); getSupportFragmentManager().addOnBackStackChangedListener(() -> { Fragment current = getSupportFragmentManager().findFragmentById(R.id.fragment_container); if (current instanceof SettingsFragment) { tv_center.setText("实时监控"); if (iv_left != null) { iv_left.setImageResource(R.mipmap.icon_menu); iv_left.setOnClickListener(v -> { if (drawerLayout != null) { drawerLayout.openDrawer(GravityCompat.START); } }); } if (tv_scan != null) { tv_scan.setVisibility(View.VISIBLE); if (BleGlobalManager.getInstance().isConnected()) { updateConnectedUI(); } else { tv_scan.setText("连接蓝牙"); tv_scan.setOnClickListener(v -> showDeviceListFragment()); } } if (iv_right != null) iv_right.setVisibility(View.GONE); } else if (current instanceof DeviceListFragment) { tv_center.setText("蓝牙设备"); if (iv_left != null) { iv_left.setImageResource(R.mipmap.icon_back); iv_left.setOnClickListener(v -> onBackPressed()); } if (tv_scan != null) { tv_scan.setVisibility(View.VISIBLE); tv_scan.setText("SCAN"); tv_scan.setOnClickListener(v -> { long currentTime = System.currentTimeMillis(); if (currentTime - lastScanClickTime < 2000) { Toast("点击过快,请稍后重试!"); return; } lastScanClickTime = currentTime; if (deviceListFragment != null && deviceListFragment.isVisible()) { deviceListFragment.startScan(); } }); } if (iv_right != null) iv_right.setVisibility(View.VISIBLE); } }); // Default show SettingsFragment showSettingsFragment(); } @Override protected void initData() { mBluetoothUtils = BluetoothUtils.getInstance(this); mDeviceStore = new BluetoothLeDeviceStore(); scanManager = BluetoothScanManager.getInstance(this); } @Override protected void initEvent() { iv_left.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (drawerLayout != null) { drawerLayout.openDrawer(GravityCompat.START); } } }); // 抽屉菜单点击事件 // 实时监控 findViewById(R.id.menu_monitor).setOnClickListener(v -> { updateDrawerSelection(R.id.menu_monitor); Toast.makeText(this, "实时监控", Toast.LENGTH_SHORT).show(); showSettingsFragment(); drawerLayout.closeDrawer(GravityCompat.START); }); // 蓝牙设备 findViewById(R.id.menu_devices).setOnClickListener(v -> { updateDrawerSelection(R.id.menu_devices); showDeviceListFragment(); drawerLayout.closeDrawer(GravityCompat.START); }); // 当前设备 findViewById(R.id.menu_current_device).setOnClickListener(v -> { drawerLayout.closeDrawer(GravityCompat.START); startActivity(new Intent(this, CurrentDeviceActivity.class)); }); // 参数设定 findViewById(R.id.menu_settings).setOnClickListener(v -> { drawerLayout.closeDrawer(GravityCompat.START); startActivity(new Intent(this, ParameterSettingActivity.class)); }); // 高级设置 findViewById(R.id.menu_advanced_settings).setOnClickListener(v -> { drawerLayout.closeDrawer(GravityCompat.START); startActivity(new Intent(this, AdvancedSettingActivity.class)); }); } private void updateDrawerSelection(int selectedId) { int[] menuIds = {R.id.menu_monitor, R.id.menu_devices, R.id.menu_current_device, R.id.menu_settings, R.id.menu_advanced_settings}; for (int id : menuIds) { View view = findViewById(id); if (view != null) { boolean isSelected = (id == selectedId); view.setSelected(isSelected); // Manually set selected state for children because duplicateParentState="true" might be missing if (view instanceof android.view.ViewGroup) { android.view.ViewGroup group = (android.view.ViewGroup) view; for (int i = 0; i < group.getChildCount(); i++) { group.getChildAt(i).setSelected(isSelected); } } } } } public void showSettingsFragment() { tv_center.setText("实时监控"); if (tv_scan != null) { tv_scan.setVisibility(View.VISIBLE); tv_scan.setText("连接蓝牙"); tv_scan.setOnClickListener(v -> showDeviceListFragment()); } if (iv_right != null) iv_right.setVisibility(View.GONE); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if (settingsFragment == null) { settingsFragment = new SettingsFragment(); } ft.replace(R.id.fragment_container, settingsFragment); ft.commit(); } public void showDeviceListFragment() { updateDrawerSelection(R.id.menu_devices); tv_center.setText("蓝牙设备"); if (tv_scan != null) { tv_scan.setVisibility(View.VISIBLE); tv_scan.setText("SCAN"); tv_scan.setOnClickListener(v -> { // 节流逻辑:两秒内只能点一次 long currentTime = System.currentTimeMillis(); if (currentTime - lastScanClickTime < 2000) { Toast("点击过快,请稍后重试!"); return; } lastScanClickTime = currentTime; if (deviceListFragment != null && deviceListFragment.isVisible()&&scanManager!=null&&!scanManager.isScanning()) { deviceListFragment.startScan(); } }); } if (iv_right != null) iv_right.setVisibility(View.VISIBLE); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if (deviceListFragment == null) { deviceListFragment = new DeviceListFragment(); } ft.replace(R.id.fragment_container, deviceListFragment); ft.addToBackStack(null); ft.commit(); } public BluetoothScanManager getScanManager() { return scanManager; } public BluetoothLeDeviceStore getDeviceStore() { return mDeviceStore; } public BluetoothUtils getBluetoothUtils() { return mBluetoothUtils; } @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { } @Subscribe(threadMode = ThreadMode.MAIN) public void onEventRefresh(UpdateEvent event) { if (event.getType() == UpdateEvent.Type.CONN_STATU) { int status = 0; if (event.getObj() instanceof Integer) { status = (int) event.getObj(); } if (status == android.bluetooth.BluetoothProfile.STATE_CONNECTED) { updateConnectedUI(); } else if (status == android.bluetooth.BluetoothProfile.STATE_DISCONNECTED) { if (tv_scan != null) { tv_scan.setText("连接蓝牙"); tv_scan.setOnClickListener(v -> showDeviceListFragment()); } } } } private void updateConnectedUI() { if (tv_scan == null) return; com.blakequ.bluetooth_manager_lib.device.BluetoothLeDevice device = BleGlobalManager.getInstance().getBluetoothLeDevice(); String name = (device != null) ? device.getName() : "Unknown"; if (name == null) name = "Unknown"; if (name.length() > 8) { name = name.substring(0, 8) + "..."; } tv_scan.setText(name); tv_scan.setOnClickListener(v -> { new QMUIDialog.MessageDialogBuilder(this) .setTitle("提示") .setMessage("是否断开蓝牙连接?") .addAction("取消", (dialog, index) -> dialog.dismiss()) .addAction("确定", (dialog, index) -> { dialog.dismiss(); BleGlobalManager.getInstance().disconnect(); }) .create(com.qmuiteam.qmui.R.style.QMUI_Dialog).show(); }); } public void initTitlebar() { if (iv_right != null) { iv_right.setVisibility(View.VISIBLE); iv_right.setOnClickListener(v -> { androidx.appcompat.widget.PopupMenu popup = new androidx.appcompat.widget.PopupMenu(this, v); popup.getMenu().add(0, 0, 0, "监控页"); popup.getMenu().add(0, 1, 1, "测试页"); popup.setOnMenuItemClickListener(item -> { if (item.getItemId() == 0) { DeviceListFragment.setNavigationMode(DeviceListFragment.MODE_RETURN_SETTINGS); Toast.makeText(HomeActivity.this, "已切换:连接后返回监控页", Toast.LENGTH_SHORT).show(); } else if (item.getItemId() == 1) { DeviceListFragment.setNavigationMode(DeviceListFragment.MODE_GO_TO_TEST); Toast.makeText(HomeActivity.this, "已切换:连接后跳转到测试页", Toast.LENGTH_SHORT).show(); } return true; }); popup.show(); }); } } @Override public void onBackPressed() { if (drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawer(GravityCompat.START); } else { // Check if we are in DeviceListFragment and can go back Fragment current = getSupportFragmentManager().findFragmentById(R.id.fragment_container); if (current instanceof DeviceListFragment) { super.onBackPressed(); } else { ExitApp(); } } } private long exitTime = 0; public void ExitApp() { if ((System.currentTimeMillis() - exitTime) > 2000) { Toast.makeText(this, "再按一次退出程序!", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); } } }