Don't show developer options to secondary users

Show just a message that developer options are not available for the user.

Also fix silent exit of AddAccount operation by showing a toast that user
cannot add accounts.

Bug: 7409523
Bug: 8519646
Bug: 7304007

Change-Id: Id3f430d568d6b7151ac55f86dbc0ef91803fa10c
diff --git a/res/values/strings.xml b/res/values/strings.xml
index af02ae5..6f43881 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3036,6 +3036,8 @@
     <!-- Development Settings summary.  The summary of the item to take the user to Development settings.  Development settings are settings meant for application developers. -->
     <string name="development_settings_summary">Set options for app development</string>
     <!-- Setting checkbox title for Whether to enable USB debugging support on the phone. -->
+    <!-- Error message for users that aren't allowed to modify developer options [CHAR LIMIT=none] -->
+    <string name="development_settings_not_available">Developer options are not available for this user</string>
     <string name="enable_adb">USB debugging</string>
     <!-- Setting checkbox summary for Whether to enable USB debugging support on the phone -->
     <string name="enable_adb_summary">Debug mode when USB is connected</string>
@@ -4369,6 +4371,8 @@
     <string name="user_cannot_manage_message" product="tablet">Only the tablet\'s owner can manage users.</string>
     <!-- Message to secondary users that only owner can manage users [CHAR LIMIT=none] -->
     <string name="user_cannot_manage_message" product="default">Only the phone\'s owner can manage users.</string>
+    <!-- Message to limited users that they cannot add accounts [CHAR LIMIT=100] -->
+    <string name="user_cannot_add_accounts_message">Limited users cannot add accounts</string>
 
     <!-- User details remove user menu [CHAR LIMIT=20] -->
     <string name="user_remove_user_menu">Delete <xliff:g id="user_name">%1$s</xliff:g> from this device</string>
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 8694e9d..4597bf0 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -47,6 +47,7 @@
 import android.os.StrictMode;
 import android.os.SystemProperties;
 import android.os.UserHandle;
+import android.os.UserManager;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
@@ -64,6 +65,7 @@
 import android.view.View;
 import android.widget.CompoundButton;
 import android.widget.Switch;
+import android.widget.TextView;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -202,6 +204,8 @@
     private Dialog mAdbDialog;
     private Dialog mAdbKeysDialog;
 
+    private boolean mUnavailable;
+
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
@@ -211,6 +215,12 @@
                 ServiceManager.getService(Context.BACKUP_SERVICE));
         mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
 
+        if (android.os.Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER) {
+            mUnavailable = true;
+            setPreferenceScreen(new PreferenceScreen(getActivity(), null));
+            return;
+        }
+
         addPreferencesFromResource(R.xml.development_prefs);
 
         mEnableAdb = findAndInitCheckboxPref(ENABLE_ADB);
@@ -333,6 +343,10 @@
         final int padding = activity.getResources().getDimensionPixelSize(
                 R.dimen.action_bar_switch_padding);
         mEnabledSwitch.setPaddingRelative(0, 0, padding, 0);
+        if (mUnavailable) {
+            mEnabledSwitch.setEnabled(false);
+            return;
+        }
         mEnabledSwitch.setOnCheckedChangeListener(this);
     }
 
@@ -379,6 +393,16 @@
     public void onResume() {
         super.onResume();
 
+        if (mUnavailable) {
+            // Show error message
+            TextView emptyView = (TextView) getView().findViewById(android.R.id.empty);
+            getListView().setEmptyView(emptyView);
+            if (emptyView != null) {
+                emptyView.setText(R.string.development_settings_not_available);
+            }
+            return;
+        }
+
         if (mDpm.getMaximumTimeToLock(null) > 0) {
             // A DeviceAdmin has specified a maximum time until the device
             // will lock...  in this case we can't allow the user to turn
diff --git a/src/com/android/settings/accounts/AddAccountSettings.java b/src/com/android/settings/accounts/AddAccountSettings.java
index f1b7752..39906eb 100644
--- a/src/com/android/settings/accounts/AddAccountSettings.java
+++ b/src/com/android/settings/accounts/AddAccountSettings.java
@@ -28,7 +28,9 @@
 import android.os.Bundle;
 import android.os.UserManager;
 import android.util.Log;
+import android.widget.Toast;
 
+import com.android.settings.R;
 import com.android.settings.Utils;
 
 import java.io.IOException;
@@ -124,9 +126,15 @@
         }
 
         final UserManager um = (UserManager) getSystemService(Context.USER_SERVICE);
-        if (mAddAccountCalled || um.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
+        if (um.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
+            // We aren't allowed to add an account.
+            Toast.makeText(this, R.string.user_cannot_add_accounts_message, Toast.LENGTH_LONG)
+                    .show();
+            finish();
+            return;
+        }
+        if (mAddAccountCalled) {
             // We already called add account - maybe the callback was lost.
-            // Or we aren't allowed to add an account.
             finish();
             return;
         }
diff --git a/src/com/android/settings/accounts/ManageAccountsSettings.java b/src/com/android/settings/accounts/ManageAccountsSettings.java
index 46aa566..8a093ca 100644
--- a/src/com/android/settings/accounts/ManageAccountsSettings.java
+++ b/src/com/android/settings/accounts/ManageAccountsSettings.java
@@ -332,6 +332,7 @@
                 getPreferenceScreen().addPreference(preference);
                 if (mFirstAccount == null) {
                     mFirstAccount = account;
+                    getActivity().invalidateOptionsMenu();
                 }
             }
         }