Unregister hotspot receiver in TetherService.

- when the service exits, also unregister the hotspot receiver.
- move TetherService and HotspotOffReceiver to wifi.tether package.

Change-Id: I0044a52bf80a5530a58b5186ab056de55e83532b
Fixes: 69844871
Test: make RunSettingsRoboTests
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 51a811d..9e4dc39 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -476,7 +476,7 @@
             </intent-filter>
         </activity>
 
-        <service android:name=".TetherService"
+        <service android:name=".wifi.tether.TetherService"
             android:exported="true"
             android:permission="android.permission.TETHER_PRIVILEGED" />
 
diff --git a/src/com/android/settings/HotspotOffReceiver.java b/src/com/android/settings/wifi/tether/HotspotOffReceiver.java
similarity index 97%
rename from src/com/android/settings/HotspotOffReceiver.java
rename to src/com/android/settings/wifi/tether/HotspotOffReceiver.java
index 4083082..fcbf888 100644
--- a/src/com/android/settings/HotspotOffReceiver.java
+++ b/src/com/android/settings/wifi/tether/HotspotOffReceiver.java
@@ -1,5 +1,5 @@
 
-package com.android.settings;
+package com.android.settings.wifi.tether;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
diff --git a/src/com/android/settings/TetherService.java b/src/com/android/settings/wifi/tether/TetherService.java
similarity index 98%
rename from src/com/android/settings/TetherService.java
rename to src/com/android/settings/wifi/tether/TetherService.java
index fce3f27..e491de8 100644
--- a/src/com/android/settings/TetherService.java
+++ b/src/com/android/settings/wifi/tether/TetherService.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings;
+package com.android.settings.wifi.tether;
 
 import android.app.Activity;
 import android.app.AlarmManager;
@@ -167,11 +167,16 @@
         SharedPreferences prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
         prefs.edit().putString(KEY_TETHERS, tethersToString(mCurrentTethers)).commit();
 
+        unregisterReceivers();
         if (DEBUG) Log.d(TAG, "Destroying TetherService");
-        unregisterReceiver(mReceiver);
         super.onDestroy();
     }
 
+    private void unregisterReceivers() {
+        unregisterReceiver(mReceiver);
+        mHotspotReceiver.unregister();
+    }
+
     private void removeTypeAtIndex(int index) {
         mCurrentTethers.remove(index);
         // If we are currently in the middle of a check, we may need to adjust the
diff --git a/tests/robotests/src/com/android/settings/TetherServiceTest.java b/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
similarity index 72%
rename from tests/robotests/src/com/android/settings/TetherServiceTest.java
rename to tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
index 0275c15..583bd52 100644
--- a/tests/robotests/src/com/android/settings/TetherServiceTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/TetherServiceTest.java
@@ -13,17 +13,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.settings;
+package com.android.settings.wifi.tether;
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.SharedPreferences;
 import android.net.wifi.WifiManager;
 
+import com.android.settings.TestConfig;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 
 import java.util.ArrayList;
@@ -87,4 +93,22 @@
         mService.cancelAlarmIfNecessary();
         verify(mContext).unregisterReceiver(any(HotspotOffReceiver.class));
     }
+
+    @Test
+    public void onDestroy_shouldUnregisterReceiver() {
+        final ArrayList<Integer> tethers = new ArrayList<>();
+        ReflectionHelpers.setField(mService, "mCurrentTethers", tethers);
+        ReflectionHelpers.setField(mService, "mBase", mContext);
+        final SharedPreferences prefs = mock(SharedPreferences .class);
+        final SharedPreferences.Editor editor = mock(SharedPreferences.Editor.class);
+        when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(prefs);
+        when(prefs.edit()).thenReturn(editor);
+        when(editor.putString(anyString(), anyString())).thenReturn(editor);
+        final HotspotOffReceiver hotspotOffReceiver = mock(HotspotOffReceiver.class);
+        mService.setHotspotOffReceiver(hotspotOffReceiver);
+
+        mService.onDestroy();
+
+        verify(hotspotOffReceiver).unregister();
+    }
 }
diff --git a/tests/unit/src/com/android/settings/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
similarity index 98%
rename from tests/unit/src/com/android/settings/TetherServiceTest.java
rename to tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
index 899ea7a..7bf5798 100644
--- a/tests/unit/src/com/android/settings/TetherServiceTest.java
+++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.settings;
+package com.android.settings.wifi.tether;
 
 import static org.junit.Assert.*;
 import static org.mockito.Matchers.*;
@@ -49,17 +49,13 @@
 import android.content.SharedPreferences.Editor;
 import android.content.res.Resources;
 import android.net.ConnectivityManager;
-import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.ResultReceiver;
 import android.os.SystemClock;
 import android.test.ServiceTestCase;
-import android.test.mock.MockResources;
 import android.util.Log;
 
-import com.android.settings.TetherService;
-
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;