config_enableWifiDisplay - kensuke/How-to-Miracast-on-AOSP GitHub Wiki
.
#Why my android >= 4.2 device does not have Wireless display on Setting menu?
->
- /frameworks/base/core/res/res/values/config.xml
- Nexus 4: /device/lge/mako/overlay/frameworks/base/core/res/res/values/config.xml
<!-- <bool name="config_enableWifiDisplay">false</bool>-->
<bool name="config_enableWifiDisplay">true</bool>
or
$ 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
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
// ...
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 }
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
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 }
273 public WifiDisplayStatus getWifiDisplayStatus() {
274 return mGlobal.getWifiDisplayStatus();
275 }
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 }
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();
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