Skip to content

config_enableWifiDisplay

RC3 edited this page Jul 23, 2013 · 5 revisions

. #Why my android >= 4.2 device does not have Wireless display on Setting menu? ->

Because

config.xml

   <!-- <bool name="config_enableWifiDisplay">false</bool>-->
   <bool name="config_enableWifiDisplay">true</bool>

or

build.prop

 $ adb root
 $ adb remount
 $ adb pull /system/build.prop
  (add persist.debug.wfd.enable=1 to build.prop)
 $ adb push build.prop /system/
 $ adb shell chmod 644 /system/build.prop
 $ adb reboot

Sequence Diagram

Method Flow

initialize in device booting

1. Device Power ON

2. invoke Zygote

3. invoke system_server

     45 int main(int argc, const char* const argv[])
     46 {
     47     ALOGI("System server is starting with pid=%d.\n", getpid());
     48 
     49     blockSignals();
     50 
     51     // You can trust me, honestly!
     52     ALOGW("*** Current priority: %d\n", getpriority(PRIO_PROCESS, 0));
     53     setpriority(PRIO_PROCESS, 0, -1);
     54 
     55     system_init();
     56 }
     57 
     50 extern "C" status_t system_init()
     51 {
     52     ALOGI("Entered system_init()");
        // ...
     89     jclass clazz = env->FindClass("com/android/server/SystemServer");
     90     if (clazz == NULL) {
     91         return UNKNOWN_ERROR;
     92     }
     93     jmethodID methodId = env->GetStaticMethodID(clazz, "init2", "()V");
     94     if (methodId == NULL) {
     95         return UNKNOWN_ERROR;
     96     }
     97     env->CallStaticVoidMethod(clazz, methodId); // Call Java method
        // ...

4. SystemServer.java

   1067     public static final void init2() {
   1068         Slog.i(TAG, "Entered the Android system server!");
   1069         Thread thr = new ServerThread();
   1070         thr.setName("android.server.ServerThread");
   1071         thr.start();
   1072     }
     75 class ServerThread extends Thread {
       // ...
     88     public void run() {
       // ...
    128         DisplayManagerService display = null;
       // ...
    220             Slog.i(TAG, "Display Manager");
    221             display = new DisplayManagerService(context, wmHandler, uiHandler);
    222             ServiceManager.addService(Context.DISPLAY_SERVICE, display, true);
       // ...
    828         try {
    829             display.systemReady(safeMode, onlyCore);
    830         } catch (Throwable e) {
    831             reportWtf("making Display Manager Service ready", e);
    832         }

5. DisplayManagerService.java

    245     public void systemReady(boolean safeMode, boolean onlyCore) {
    246         synchronized (mSyncRoot) {
    247             mSafeMode = safeMode;
    248             mOnlyCore = onlyCore;
    249         }
    250 
    251         mHandler.sendEmptyMessage(MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS);
    252     }
    938     private final class DisplayManagerHandler extends Handler {
       // ...
    944         public void handleMessage(Message msg) {
    945             switch (msg.what) {
       // ...
    950                 case MSG_REGISTER_ADDITIONAL_DISPLAY_ADAPTERS:
    951                     registerAdditionalDisplayAdapters();
    952                     break;
    531     private void registerAdditionalDisplayAdapters() {
    532         synchronized (mSyncRoot) {
    533             if (shouldRegisterNonEssentialDisplayAdaptersLocked()) {
    534                 registerOverlayDisplayAdapterLocked();
    535                 registerWifiDisplayAdapterLocked();
    536             }
    537         }
    538     }
    545     private void registerWifiDisplayAdapterLocked() {
    546         if (mContext.getResources().getBoolean(
    547                 com.android.internal.R.bool.config_enableWifiDisplay)
    548                 || SystemProperties.getInt(FORCE_WIFI_DISPLAY_ENABLE, -1) == 1) {
    549             mWifiDisplayAdapter = new WifiDisplayAdapter(
    550                     mSyncRoot, mContext, mHandler, mDisplayAdapterListener,
    551                     mPersistentDataStore);
    552             registerDisplayAdapterLocked(mWifiDisplayAdapter);
    553         }
    554     }
     95     private static final String FORCE_WIFI_DISPLAY_ENABLE = "persist.debug.wfd.enable";
  • IMPORTANT THING
  if 
    config.xml config_enableWifiDisplay=true
      or
    build.prop persist.debug.wfd.enable=1
  then
    instantiate WifiDisplayAdapter
  else
    null

refer from Settings App

6. DisplaySettings.java

     90     public void onCreate(Bundle savedInstanceState) {
       // ...
    137         mDisplayManager = (DisplayManager)getActivity().getSystemService(
    138                 Context.DISPLAY_SERVICE);
    139         mWifiDisplayStatus = mDisplayManager.getWifiDisplayStatus();
    140         mWifiDisplayPreference = (Preference)findPreference(KEY_WIFI_DISPLAY);
    141         if (mWifiDisplayStatus.getFeatureState()
    142                 == WifiDisplayStatus.FEATURE_STATE_UNAVAILABLE) {
    143             getPreferenceScreen().removePreference(mWifiDisplayPreference); // remove "Wireless Display"
    144             mWifiDisplayPreference = null;
    145         }

7. DisplayManager.java

    273     public WifiDisplayStatus getWifiDisplayStatus() {
    274         return mGlobal.getWifiDisplayStatus();
    275     }

8. DisplayManagerGlobal.java

     63     private final IDisplayManager mDm;
       // ...
     72     private DisplayManagerGlobal(IDisplayManager dm) {
     73         mDm = dm;
     74     }
       // ...
    309     public WifiDisplayStatus getWifiDisplayStatus() {
    310         try {
    311             return mDm.getWifiDisplayStatus();
    312         } catch (RemoteException ex) {
    313             Log.e(TAG, "Failed to get Wifi display status.", ex);
    314             return new WifiDisplayStatus();
    315         }
    316     }

9. DisplayManagerService.java

    498     public WifiDisplayStatus getWifiDisplayStatus() {
    499         final long token = Binder.clearCallingIdentity();
    500         try {
    501             synchronized (mSyncRoot) {
    502                 if (mWifiDisplayAdapter != null) {
    503                     return mWifiDisplayAdapter.getWifiDisplayStatusLocked();
    504                 } else {
    505                     return new WifiDisplayStatus();
    506                 }
    507             }
    508         } finally {
    509             Binder.restoreCallingIdentity(token);
    510         }
    511     }
  • check instantiate WifiDisplayAdapter
    • pattern1 - mWifiDisplayAdapter.getWifiDisplayStatusLocked();
    • pattern2 - new WifiDisplayStatus();

9. pattern2 - WifiDisplayStatus.java - null Constructor

     92     public WifiDisplayStatus() {
     93         this(FEATURE_STATE_UNAVAILABLE, SCAN_STATE_NOT_SCANNING, DISPLAY_STATE_NOT_CONNECTED,
     94                 null, WifiDisplay.EMPTY_ARRAY, WifiDisplay.EMPTY_ARRAY);
     95     }
     96 
     97     public WifiDisplayStatus(int featureState, int scanState,
     98             int activeDisplayState, WifiDisplay activeDisplay,
     99             WifiDisplay[] availableDisplays, WifiDisplay[] rememberedDisplays) {
    100         if (availableDisplays == null) {
    101             throw new IllegalArgumentException("availableDisplays must not be null");
    102         }
    103         if (rememberedDisplays == null) {
    104             throw new IllegalArgumentException("rememberedDisplays must not be null");
    105         }
    106 
    107         mFeatureState = featureState;
    108         mScanState = scanState;
    109         mActiveDisplayState = activeDisplayState;
    110         mActiveDisplay = activeDisplay;
    111         mAvailableDisplays = availableDisplays;
    112         mRememberedDisplays = rememberedDisplays;
    113     }
       // ...
    123     public int getFeatureState() {
    124         return mFeatureState;
    125     }
mFeatureState = FEATURE_STATE_UNAVAILABLE