diff --git a/services/core/java/com/android/server/NsdService.java b/services/core/java/com/android/server/NsdService.java index a691af9c01..e37aa6362e 100644 --- a/services/core/java/com/android/server/NsdService.java +++ b/services/core/java/com/android/server/NsdService.java @@ -26,6 +26,8 @@ import android.net.nsd.DnsSdTxtRecord; import android.net.nsd.INsdManager; import android.net.nsd.NsdManager; import android.os.Binder; +import android.os.HandlerThread; +import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.os.UserHandle; @@ -40,6 +42,7 @@ import java.net.InetAddress; import java.util.HashMap; import java.util.concurrent.CountDownLatch; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.AsyncChannel; import com.android.internal.util.Protocol; import com.android.internal.util.State; @@ -59,7 +62,7 @@ public class NsdService extends INsdManager.Stub { private static final boolean DBG = true; private final Context mContext; - private final ContentResolver mContentResolver; + private final NsdSettings mNsdSettings; private final NsdStateMachine mNsdStateMachine; private final NativeDaemonConnector mNativeConnector; private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1); @@ -108,8 +111,8 @@ public class NsdService extends INsdManager.Stub { false, contentObserver); } - NsdStateMachine(String name) { - super(name); + NsdStateMachine(String name, Handler handler) { + super(name, handler); addState(mDefaultState); addState(mDisabledState, mDefaultState); addState(mEnabledState, mDefaultState); @@ -541,14 +544,15 @@ public class NsdService extends INsdManager.Stub { return sb.toString(); } - private NsdService(Context context) { - mContext = context; - mContentResolver = context.getContentResolver(); + @VisibleForTesting + NsdService(Context ctx, NsdSettings settings, Handler handler) { + mContext = ctx; + mNsdSettings = settings; - mNativeConnector = new NativeDaemonConnector(new NativeCallbackReceiver(), "mdns", 10, - MDNS_TAG, 25, null); + NativeCallbackReceiver callback = new NativeCallbackReceiver(); + mNativeConnector = new NativeDaemonConnector(callback, "mdns", 10, MDNS_TAG, 25, null); - mNsdStateMachine = new NsdStateMachine(TAG); + mNsdStateMachine = new NsdStateMachine(TAG, handler); mNsdStateMachine.start(); Thread th = new Thread(mNativeConnector, MDNS_TAG); @@ -556,21 +560,24 @@ public class NsdService extends INsdManager.Stub { } public static NsdService create(Context context) throws InterruptedException { - NsdService service = new NsdService(context); + NsdSettings settings = NsdSettings.makeDefault(context); + HandlerThread thread = new HandlerThread(TAG); + thread.start(); + Handler handler = new Handler(thread.getLooper()); + NsdService service = new NsdService(context, settings, handler); service.mNativeDaemonConnected.await(); return service; } public Messenger getMessenger() { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INTERNET, - "NsdService"); + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INTERNET, "NsdService"); return new Messenger(mNsdStateMachine.getHandler()); } public void setEnabled(boolean enable) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL, "NsdService"); - Settings.Global.putInt(mContentResolver, Settings.Global.NSD_ON, enable ? 1 : 0); + mNsdSettings.putEnabledStatus(enable); if (enable) { mNsdStateMachine.sendMessage(NsdManager.ENABLE); } else { @@ -590,8 +597,10 @@ public class NsdService extends INsdManager.Stub { } private boolean isNsdEnabled() { - boolean ret = Settings.Global.getInt(mContentResolver, Settings.Global.NSD_ON, 1) == 1; - if (DBG) Slog.d(TAG, "Network service discovery enabled " + ret); + boolean ret = mNsdSettings.isEnabled(); + if (DBG) { + Slog.d(TAG, "Network service discovery is " + (ret ? "enabled" : "disabled")); + } return ret; } @@ -927,4 +936,25 @@ public class NsdService extends INsdManager.Stub { return -1; } } + + @VisibleForTesting + public interface NsdSettings { + boolean isEnabled(); + void putEnabledStatus(boolean isEnabled); + + static NsdSettings makeDefault(Context context) { + ContentResolver resolver = context.getContentResolver(); + return new NsdSettings() { + @Override + public boolean isEnabled() { + return Settings.Global.getInt(resolver, Settings.Global.NSD_ON, 1) == 1; + } + + @Override + public void putEnabledStatus(boolean isEnabled) { + Settings.Global.putInt(resolver, Settings.Global.NSD_ON, isEnabled ? 1 : 0); + } + }; + } + } }