Setting学习笔记-Wifi/Bluetooth开关

897 阅读3分钟

1.WLAN

基础:

NetworkDashboardFragment.java => network_and_internet.xml

  • fragment : WifiSettings.java => WifiSettings2.java

  • controller :

     final WifiMasterSwitchPreferenceController wifiPreferenceController =
         new WifiMasterSwitchPreferenceController(context, metricsFeatureProvider);
    

WLAN开关

WifiMasterSwitchPreferenceController.java

[implements] LifecycleObserver | OnResume | OnPause | OnStart | OnStop

  • 创建 WifiEnabler 对象【很重要】

     mWifiEnabler = new WifiEnabler(
         mContext, 
         new MasterSwitchController(mWifiPreference),
         mMetricsFeatureProvider);
    
  • WifiEnabler.java

    • 包含 Switch开关 - SwitchWidgetController,可操控 isChecked | isEnabled

       mSwitchWidget.setListener(this); //注册回调,回调:onSwitchToggled()
      
    • onSwitchToggled() => 通过aidl,mWifiManager-开关Wifi

    • 注册广播接收器,收到 WifiManager.WIFI_STATE_CHANGED_ACTION 后,更新Switch状态

  • MasterSwitchController.java [extends SwitchWidgetController.java]

    WLAN开关-Switch具体对应的PreferenceController

    onPreferenceChange() => switch状态变化时,会回调 WifiEnabler的 onSwitchToggled (true|false)


     public MasterSwitchController(MasterSwitchPreference preference) {
         mPreference = preference;
     }
    
  • MasterSwitchPreference.java [extends RestrictedPreference.java]

    WLAN开关-Switch具体对应的Preference

    包含成员变量:Switch mSwitch

    注册switch 的点击事件,并最终调用到 onPreferenceChange()


WifiSettings2-开关

WifiSettings2 : WLAN开关Preference,点击后跳转的Fragment


创建 WifiEnabler 【包括 switch开关 逻辑】

 private WifiEnabler createWifiEnabler() {
 final SettingsActivity activity = (SettingsActivity) getActivity();
 return new WifiEnabler(
   activity, 
   new SwitchBarController(activity.getSwitchBar()),
   mMetricsFeatureProvider);
 }
 com.android.settings.widget 【包名,不是应用开发的 SwitchBar】
 SwitchBar | SwitchBarController

SwitchBar.java

开关对象,注册监听,开启/关闭 swtich时,更新背景(绿/灰)

setTextViewLabelAndBackground() 【更新背景】

onCheckedChanged()

=> 回调 SwitchBarController的 onSwitchChanged()

=> 回调 mListener的 onSwitchToggled() 【WifiEnabler::onSwitchToggled()】

SwitchBarController.java [ extends SwitchWidgetController.java ]

  • 生命周期 startListening() => 注册回调接口

     mSwitchBar.addOnSwitchChangeListener(this);
    
  • onSwitchChanged() => 回调 mListener的 onSwitchToggled() 【注册回调和WLAN开关一样,在WifiEnabler中】


WifiSettings2-list展示

WifiSettings2.java

两个回调方法:

  • onWifiStateChanged()
  • onWifiEntriesChanged()

onWifiEntriesChanged() => updateWifiEntryPreferencesDelayed() 【显示进度条,异步执行Runnable任务】

=> 异步任务:【 updateWifiEntryPreferences() 】


已连接网络: mConnectedWifiEntryPreferenceCategory

  • 点击事件: launchNetworkDetailsFragment ( pref )
  • 跳转 WifiNetworkDetailsFragment2.java

WifiEntries: mWifiEntryPreferenceCategory

  • 点击事件: connect() => ConfigureWifiEntryFragment.java => WifiConfigController2.java
  • 触发 onWifiEntriesChanged() ,从而更新两个 PreferenceCategory

添加网络Pref点击事件: launchAddNetworkFragment()

wifi列表每个项:

  • ConnectedWifiEntryPreference.java
  • LongPressWifiEntryPreference.java
  • WifiEntryPreference.java

2.已连接设备

connected_devices.xml

其他设备-USB

调用关系:

 // ConnectedDeviceDashboardFragment.java
 use(ConnectedDeviceGroupController.class).init(this);
 ​
 ​
 // ConnectedDeviceGroupController.java
 // init()方法:创建一系列Updater对象(new):
 ConnectedBluetoothDeviceUpdater | ConnectedUsbDeviceUpdater | connectedDockUpdater
 // displayPreference()方法:
 mConnectedUsbDeviceUpdater.initUsbPreference(context); //创建Preference【usb连接的Preference】
 //onStart()|onStop()中,注册|注销 BroadcastReceiver
 ​
 ​
 // ConnectedUsbDeviceUpdater.java
 // 构造方法
 ConnectedUsbDeviceUpdater(Context context, DashboardFragment fragment,
                  DevicePreferenceCallback devicePreferenceCallback, UsbBackend usbBackend) {
 mFragment = fragment; // ConnectedDeviceDashboardFragment
 mDevicePreferenceCallback = devicePreferenceCallback; //传入ConnectedDeviceGroupController,其实现了该接口
 mUsbBackend = usbBackend;
 mUsbReceiver = new UsbConnectionBroadcastReceiver(context,
                                              mUsbConnectionListener, mUsbBackend);
 mMetricsFeatureProvider = FeatureFactory.getFactory(mFragment.getContext())
 .getMetricsFeatureProvider();
 }
 // initUsbPreference()方法,创建Preference
 //点击事件:跳转 UsbDetailsFragment
 new SubSettingLauncher(mFragment.getContext())
 .setDestination(UsbDetailsFragment.class.getName())
 .setTitleRes(R.string.device_details_title)
 .setSourceMetricsCategory(mFragment.getMetricsCategory())
 .launch();
 ​
 //////////////////////////
 UsbDetailsFragment extends DashboardFragment{} // USB偏好设置页
 /*【重要】*/UsbConnectionBroadcastReceiver extends BroadcastReceiver implements LifecycleObserver,OnResume,OnPause{}
 ​
 // UsbDetailsFragment中 使用 UsbConnectionBroadcastReceiver:
 this.getSettingsLifecycle().addObserver(mUsbReceiver);
 // 未使用过:疑问点
 import com.android.settingslib.core.lifecycle.LifecycleObserver;
 import com.android.settingslib.core.lifecycle.events.OnPause;
 import com.android.settingslib.core.lifecycle.events.OnResume;
 // USB 的用途 : 文件传输|USB网络共享|不进行数据传输...
 // UsbDetailsFragment.java : createControllerList()【赋值给成员变量:mControllers】
 //mControllers: USB受控于: | USB的用途 ...[PreferenceCategory]
 new UsbDetailsFunctionsController(context, fragment, usbBackend);
 ​
 /*【重要】*/ UsbDetailsFunctionsController extends UsbDetailsController implements RadioButtonPreference.OnClickListener{}

UsbDetailsFunctionsController.java

  • 创建 RadioButtonPreference :

    UsbDetailsFunctionsController.java :

    • 成员变量 FUNCTIONS_MAP : Map<Long,Integer> 【五个键值对,UsbManager.FUNCTION_NONE ...】
    • refresh() =调用=> getProfilePreference() 【创建Preference,并add进 mProfilesContainer】

    UsbDetailsFragment.java:

    • 成员变量 mUsbConnectionListener:UsbConnectionBroadcastReceiver.UsbConnectionListener
    • UsbConnectionListener 回调方法:onUsbConnectionChanged();会调用controller.refresh() 【mControllers里取值】

    UsbConnectionBroadcastReceiver.java:

    • 收到广播后,调用

       mUsbConnectionListener.onUsbConnectionChanged(
           mConnected, mFunctions, mPowerRole,mDataRole);
      
  • RadioButtonPreference 点击事件

    UsbDetailsFunctionsController.java :: onRadioButtonClicked()

    mUsbBackend对象:setCurrentFunctions() | getCurrentFunctions()

     mUsbManager.setCurrentFunctions(functions);
     mUsbManager.getCurrentFunctions();
    


UsbManager::setCurrentFunctions() ==具体实现==> UsbService::setCurrentFunctions()

=> UsbDeviceManager::setCurrentFunctions() 【mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);】

=> UsbDeviceManager::setEnabledFunctions(functions, false);

=> setUsbConfig()

=> setCurrentUsbFunctionsCb() 【内部类UsbGadgetCallback 的方法】

=> updateUsbStateBroadcastIfNeeded(functions);【发送广播 action: UsbManager.ACTION_USB_STATE】


config:

  • 文件传输 【5
  • USB网络共享 【33
  • MIDI 【9
  • PTP 【17
  • 仅充电(不进行数据传输) 【1

//疑问:如何导入的类?

import android.hardware.usb.gadget.V1_0.IUsbGadget; import android.hardware.usb.gadget.V1_0.IUsbGadgetCallback;


新设备配对-蓝牙

 <com.android.settingslib.RestrictedPreference
  android:key="add_bt_devices"
  android:title="@string/bluetooth_pairing_pref_title"
  android:fragment="com.android.settings.bluetooth.BluetoothPairingDetail"
  settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/>

BluetoothPairingDetail

设备名称:BluetoothDeviceRenamePreferenceController.java 【onAttach() 中声明】

footer: mFooterPreference

可用的设备:BluetoothProgressCategory mAvailableDevicesCategory;


  • 生命周期:onAttach() => onActivityCreated() => onStart()

    onStart() => updateBluetooth() => updateContent()


    => enableScanning() =...=> startScanning()

     //开始扫描-停止扫描
     void startScanning() {
      if (!mBluetoothAdapter.isDiscovering()) {
          mBluetoothAdapter.startDiscovery();
      }
     }
     void stopScanning() {
      if (mBluetoothAdapter.isDiscovering()) {
          mBluetoothAdapter.cancelDiscovery();
      }
     }
    
  • 搜索到的蓝牙设备:

    搜索到蓝牙:发送广播android.bluetooth.device.action.FOUND

    BluetoothEventManager.java

    【 内部类:BluetoothBroadcastReceiver】

    • 收到广播,进行处理【handler.onReceive(context, intent, device);】
    • intent中 保存有 BluetoothDevice对象(device)

    【内部类:DeviceFoundHandler implements Handler】

    • onReceive()方法中,创建 CachedBluetoothDevice 对象

      cachedDevice = mDeviceManager.addDevice(device);

    CachedBluetoothDeviceManager.java【mDeviceManager::addDevice()】

     // BluetoothDevice:搜索到的蓝牙设备,表示新蓝牙设备
     // CachedBluetoothDevice:平板已经缓存过的蓝牙设备
     public CachedBluetoothDevice addDevice(BluetoothDevice device) {
      CachedBluetoothDevice newDevice;
      final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
      synchronized (this) {
          newDevice = findDevice(device);  
          //如果新设备已经是缓存过的蓝牙设备,返回null;
          //否则添加进mCachedDevices列表
          if (newDevice == null) {
              newDevice = new CachedBluetoothDevice(mContext, profileManager, device);
              mHearingAidDeviceManager.initHearingAidDeviceIfNeeded(newDevice);
              if (!mHearingAidDeviceManager.setSubDeviceIfNeeded(newDevice)) {
                  mCachedDevices.add(newDevice);
                  mBtManager.getEventManager().dispatchDeviceAdded(newDevice);
              }
          }
      }
      return newDevice;
     }
    

    关键方法:mBtManager.getEventManager().dispatchDeviceAdded(newDevice);

    调用回到 BluetoothEventManager::dispatchDeviceAdded()

     void dispatchDeviceAdded(CachedBluetoothDevice cachedDevice) {
      for (BluetoothCallback callback : mCallbacks) {
          callback.onDeviceAdded(cachedDevice);
      }
     }
     //callback对象:BluetoothDeviceUpdater
    

    DeviceListPreferenceFragment::onDeviceAdded()

     public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {
         ...
         if (mFilter.matches(cachedDevice.getDevice())) {
             createDevicePreference(cachedDevice);
         }
     }
    
  • BluetoothPairingDetail.java 的onStart() 【注册callback对象[回调方法]】

     //父类: DeviceListPreferenceFragment.java
     @Override
     public void onStart() {
         super.onStart();
         if (mLocalManager == null || isUiRestricted()) return;
     ​
         mLocalManager.setForegroundActivity(getActivity());
         mLocalManager.getEventManager().registerCallback(this);
     }
     // mLocalManager.getEventManager() 即获取 BluetoothEventManager对象
     // registerCallback(this): BluetoothEventManager的mCallbacks列表添加元素
     // 最终调用自己的 onDeviceAdded() 方法
    
  • 点击事件:DeviceListPreferenceFragment::onPreferenceTreeClick()

     => onDevicePreferenceClick(btPreference);
     => btPreference.onClicked();
     ​
     //BluetoothDevicePreference.java
    

image-20230626113053306.png