Merge "Apply new action buttons style for instant app"
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 28bc1a0..cfc5fd3 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -264,8 +264,8 @@
 
     <style name="TextAppearance.Medium" parent="@android:style/TextAppearance.Material.Medium"/>
     <style name="TextAppearance.Small" parent="@android:style/TextAppearance.Material.Small"/>
-    <style name="TextAppearance.Switch" parent="@android:style/TextAppearance.Material.Title">
-        <item name="android:textSize">18sp</item>
+    <style name="TextAppearance.Switch" parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
+        <item name="android:textSize">16sp</item>
     </style>
 
     <style name="TextAppearance.CategoryTitle"
diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml
index 84ea14d..1e320e4 100644
--- a/res/xml/app_info_settings.xml
+++ b/res/xml/app_info_settings.xml
@@ -32,7 +32,9 @@
         android:key="instant_app_buttons"
         android:layout="@layout/instant_app_buttons"
         android:selectable="false"
-        android:order="-9999" />
+        android:order="-9999"
+        settings:allowDividerAbove="true"
+        settings:allowDividerBelow="true"/>
 
     <com.android.settings.widget.ActionButtonPreference
         android:key="action_buttons"
diff --git a/res/xml/app_storage_settings.xml b/res/xml/app_storage_settings.xml
index cbde0ca..14ad180 100644
--- a/res/xml/app_storage_settings.xml
+++ b/res/xml/app_storage_settings.xml
@@ -24,7 +24,8 @@
 
     <com.android.settings.applications.SpacePreference
         android:key="storage_space"
-        android:layout_height="8dp" />
+        android:layout_height="8dp"
+        settings:allowDividerAbove="true"/>
 
     <Preference
         android:key="storage_used"
@@ -41,7 +42,6 @@
     <PreferenceCategory
         android:key="storage_category"
         android:title="@string/app_info_storage_title"
-        settings:allowDividerAbove="false"
         settings:allowDividerBelow="false">
 
         <Preference
diff --git a/res/xml/power_usage_detail.xml b/res/xml/power_usage_detail.xml
index 1891702..c854f77 100644
--- a/res/xml/power_usage_detail.xml
+++ b/res/xml/power_usage_detail.xml
@@ -23,7 +23,8 @@
         android:key="header_view"
         android:layout="@layout/settings_entity_header"
         android:selectable="false"
-        android:order="-10000"/>
+        android:order="-10000"
+        settings:allowDividerBelow="true"/>
 
     <com.android.settings.widget.ActionButtonPreference
         android:key="action_buttons"
diff --git a/src/com/android/settings/homepage/contextualcards/CardContentProvider.java b/src/com/android/settings/homepage/contextualcards/CardContentProvider.java
index 74e09e8..8088143 100644
--- a/src/com/android/settings/homepage/contextualcards/CardContentProvider.java
+++ b/src/com/android/settings/homepage/contextualcards/CardContentProvider.java
@@ -98,17 +98,7 @@
 
     @Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
-        final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
-        try {
-            maybeEnableStrictMode();
-            final SQLiteDatabase database = mDBHelper.getWritableDatabase();
-            final String table = getTableFromMatch(uri);
-            final int rowsDeleted = database.delete(table, selection, selectionArgs);
-            getContext().getContentResolver().notifyChange(uri, null /* observer */);
-            return rowsDeleted;
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
+        throw new UnsupportedOperationException("delete operation not supported currently.");
     }
 
     @Override
@@ -140,18 +130,7 @@
 
     @Override
     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
-        final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy();
-        try {
-            maybeEnableStrictMode();
-
-            final SQLiteDatabase database = mDBHelper.getWritableDatabase();
-            final String table = getTableFromMatch(uri);
-            final int rowsUpdated = database.update(table, values, selection, selectionArgs);
-            getContext().getContentResolver().notifyChange(uri, null /* observer */);
-            return rowsUpdated;
-        } finally {
-            StrictMode.setThreadPolicy(oldPolicy);
-        }
+        throw new UnsupportedOperationException("update operation not supported currently.");
     }
 
     @VisibleForTesting
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 647ba5a..c98fbdb 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -71,6 +71,7 @@
 
     private WifiManager mWifiManager;
     private boolean mRestartWifiApAfterConfigChange;
+    private boolean mUnavailable;
 
     @VisibleForTesting
     TetherChangeReceiver mTetherChangeReceiver;
@@ -95,6 +96,15 @@
     }
 
     @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        setIfOnlyAvailableForAdmins(true);
+        if (isUiRestricted()) {
+            mUnavailable = true;
+        }
+    }
+
+    @Override
     public void onAttach(Context context) {
         super.onAttach(context);
         mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
@@ -109,6 +119,9 @@
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
+        if (mUnavailable) {
+            return;
+        }
         // Assume we are in a SettingsActivity. This is only safe because we currently use
         // SettingsActivity as base for all preference fragments.
         final SettingsActivity activity = (SettingsActivity) getActivity();
@@ -122,6 +135,13 @@
     @Override
     public void onStart() {
         super.onStart();
+        if (mUnavailable) {
+            if (!isUiRestrictedByOnlyAdmin()) {
+                getEmptyTextView().setText(R.string.tethering_settings_not_available);
+            }
+            getPreferenceScreen().removeAll();
+            return;
+        }
         final Context context = getContext();
         if (context != null) {
             context.registerReceiver(mTetherChangeReceiver, TETHER_STATE_CHANGE_FILTER);
@@ -131,6 +151,9 @@
     @Override
     public void onStop() {
         super.onStop();
+        if (mUnavailable) {
+            return;
+        }
         final Context context = getContext();
         if (context != null) {
             context.unregisterReceiver(mTetherChangeReceiver);
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java
index 0ffabb4..1e444bb 100644
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java
+++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/CardContentProviderTest.java
@@ -95,15 +95,12 @@
         assertThat(count).isGreaterThan(0);
     }
 
-    @Test
+    @Test(expected = UnsupportedOperationException.class)
     public void cardData_delete() {
-        mResolver.insert(mUri, generateOneRow());
         final int delCount = mResolver.delete(mUri, null, null);
-
-        assertThat(delCount).isGreaterThan(0);
     }
 
-    @Test
+    @Test(expected = UnsupportedOperationException.class)
     public void cardData_update() {
         mResolver.insert(mUri, generateOneRow());
 
@@ -113,16 +110,6 @@
         final String strWhere = CardDatabaseHelper.CardColumns.NAME + "=?";
         final String[] selectionArgs = {"auto_rotate"};
         final int updateCount = mResolver.update(mUri, values, strWhere, selectionArgs);
-
-        assertThat(updateCount).isGreaterThan(0);
-
-        final String[] columns = {CardDatabaseHelper.CardColumns.SCORE};
-        final Cursor cr = mResolver.query(mUri, columns, strWhere, selectionArgs, null);
-        cr.moveToFirst();
-        final double qryScore = cr.getDouble(0);
-
-        cr.close();
-        assertThat(qryScore).isEqualTo(updatingScore);
     }
 
     @Test
@@ -146,28 +133,6 @@
     }
 
     @Test
-    public void delete_isMainThread_shouldEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(true);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-
-        mProvider.delete(mUri, null, null);
-
-        verify(mProvider).enableStrictMode();
-    }
-
-    @Test
-    public void update_isMainThread_shouldEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(true);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-        final ContentValues values = new ContentValues();
-        values.put(CardDatabaseHelper.CardColumns.SCORE, "0.01");
-
-        mProvider.update(mUri, values, null, null);
-
-        verify(mProvider).enableStrictMode();
-    }
-
-    @Test
     public void insert_notMainThread_shouldNotEnableStrictMode() {
         ShadowThreadUtils.setIsMainThread(false);
         ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
@@ -187,28 +152,6 @@
         verify(mProvider, never()).enableStrictMode();
     }
 
-    @Test
-    public void delete_notMainThread_shouldNotEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(false);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-
-        mProvider.delete(mUri, null, null);
-
-        verify(mProvider, never()).enableStrictMode();
-    }
-
-    @Test
-    public void update_notMainThread_shouldNotEnableStrictMode() {
-        ShadowThreadUtils.setIsMainThread(false);
-        ReflectionHelpers.setStaticField(Build.class, "IS_DEBUGGABLE", true);
-        final ContentValues values = new ContentValues();
-        values.put(CardDatabaseHelper.CardColumns.SCORE, "0.01");
-
-        mProvider.update(mUri, values, null, null);
-
-        verify(mProvider, never()).enableStrictMode();
-    }
-
     @Test(expected = UnsupportedOperationException.class)
     public void getType_shouldCrash() {
         mProvider.getType(null);
diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
index 4b765e8..ef1a3b6 100644
--- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherSettingsTest.java
@@ -18,15 +18,24 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.nullable;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.res.Resources;
 import android.net.ConnectivityManager;
+import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.widget.TextView;
 
+import com.android.settings.testutils.FakeFeatureFactory;
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.shadow.ShadowWifiManager;
 
@@ -37,10 +46,14 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.PreferenceScreen;
+
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(shadows = {ShadowWifiManager.class})
 public class WifiTetherSettingsTest {
@@ -98,6 +111,31 @@
                 .isNotEmpty();
     }
 
+    @Test
+    public void startFragment_notAdminUser_shouldRemoveAllPreferences() {
+        final WifiTetherSettings settings = spy(new WifiTetherSettings());
+        final FragmentActivity activity = mock(FragmentActivity.class);
+        when(settings.getActivity()).thenReturn(activity);
+        when(settings.getContext()).thenReturn(mContext);
+        final Resources.Theme theme = mContext.getTheme();
+        when(activity.getTheme()).thenReturn(theme);
+        when(activity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
+        doNothing().when(settings)
+            .onCreatePreferences(any(Bundle.class), nullable(String.class));
+        final FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest();
+        ReflectionHelpers.setField(settings, "mDashboardFeatureProvider",
+            fakeFeatureFactory.dashboardFeatureProvider);
+        final TextView emptyTextView = mock(TextView.class);
+        ReflectionHelpers.setField(settings, "mEmptyTextView", emptyTextView);
+        final PreferenceScreen screen = mock(PreferenceScreen.class);
+        doReturn(screen).when(settings).getPreferenceScreen();
+        settings.onCreate(Bundle.EMPTY);
+
+        settings.onStart();
+
+        verify(screen).removeAll();
+    }
+
     private void setupIsTetherAvailable(boolean returnValue) {
         when(mConnectivityManager.isTetheringSupported()).thenReturn(true);