--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/pink_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/indigo_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/blue_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/teal_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/green_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/light_green_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/orange_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/deep_orange_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item>
+ <shape android:shape="oval">
+ <size android:width="40dp" android:height="40dp" />
+ <solid android:color="@color/grey_500" />
+ </shape>
+ </item>
+ <item android:top="8dp" android:bottom="8dp" android:left="8dp" android:right="8dp"
+ android:drawable="@drawable/ic_person_white" />
+</layer-list>
+
<color name="default_preference_background_color">@android:color/white</color>
<color name="preference_list_fragment_background_color">@color/default_preference_background_color</color>
<color name="search_panel_list_background_color">@color/default_preference_background_color</color>
+
+ <!-- Default avatar colors -->
+ <color name="pink_500">#ffe91e63</color>
+ <color name="indigo_500">#ff3f51b5</color>
+ <color name="blue_500">@*android:color/material_blue_500</color>
+ <color name="teal_500">@*android:color/material_teal_500</color>
+ <color name="green_500">@*android:color/material_green_500</color>
+ <color name="light_green_500">#ff8bc34a</color>
+ <color name="orange_500">@*android:color/material_orange_500</color>
+ <color name="deep_orange_500">@*android:color/material_deep_orange_500</color>
+ <!-- Avatar color used for guest -->
+ <color name="grey_500">@*android:color/material_grey_500</color>
+
</resources>
<string name="user_delete_button">Delete</string>
<!-- Title for Guest user [CHAR LIMIT=35] -->
<string name="user_guest">Guest</string>
+ <!-- Label for item to exit guest mode [CHAR LIMIT=35] -->
+ <string name="user_exit_guest_title">Exit guest</string>
+ <!-- Title of dialog to user to confirm exiting guest. [CHAR LIMIT=50] -->
+ <string name="user_exit_guest_confirm_title">Exiting guest session?</string>
+ <!-- Message to user to confirm exiting guest. [CHAR LIMIT=none] -->
+ <string name="user_exit_guest_confirm_message">Ending the guest session will remove local data.</string>
<!-- Title of preference to enable calling[CHAR LIMIT=35] -->
<string name="user_enable_calling">Enable phone calls?</string>
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
private static final int DIALOG_USER_CANNOT_MANAGE = 5;
private static final int DIALOG_CHOOSE_USER_TYPE = 6;
private static final int DIALOG_NEED_LOCKSCREEN = 7;
+ private static final int DIALOG_CONFIRM_EXIT_GUEST = 8;
private static final int MESSAGE_UPDATE_LIST = 1;
private static final int MESSAGE_SETUP_USER = 2;
"key_add_user_long_message_displayed";
static final int[] USER_DRAWABLES = {
- R.drawable.avatar_default_1,
- R.drawable.avatar_default_2,
- R.drawable.avatar_default_3,
- R.drawable.avatar_default_4,
- R.drawable.avatar_default_5,
- R.drawable.avatar_default_6,
- R.drawable.avatar_default_7,
- R.drawable.avatar_default_8
+ R.drawable.ic_avatar_default_1,
+ R.drawable.ic_avatar_default_2,
+ R.drawable.ic_avatar_default_3,
+ R.drawable.ic_avatar_default_4,
+ R.drawable.ic_avatar_default_5,
+ R.drawable.ic_avatar_default_6,
+ R.drawable.ic_avatar_default_7,
+ R.drawable.ic_avatar_default_8
};
+ private static final int GUEST_DRAWABLE_ID = R.drawable.ic_avatar_guest;
+
private static final String KEY_TITLE = "title";
private static final String KEY_SUMMARY = "summary";
private boolean mIsOwner = UserHandle.myUserId() == UserHandle.USER_OWNER;
private boolean mIsGuest;
+ // A place to cache the generated guest avatar
+ private Drawable mGuestDrawable;
+ // A place to cache the generated default avatar
+ private Drawable mDefaultAvatarDrawable;
+
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
addPreferencesFromResource(R.xml.user_settings);
mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
- mMePreference = new UserPreference(context, null, myUserId,
- mUserManager.isLinkedUser() ? null : this, null);
+ mMePreference = new UserPreference(context, null /* attrs */, myUserId,
+ mUserManager.isLinkedUser() || mIsGuest ? null : this /* settings icon handler */,
+ null /* delete icon handler */);
mMePreference.setKey(KEY_USER_ME);
mMePreference.setOnPreferenceClickListener(this);
if (mIsOwner) {
}
}
+ /**
+ * Loads profile information for the current user.
+ */
private void loadProfile() {
mProfileExists = false;
+ if (mIsGuest) {
+ // No need to load profile information
+ mMePreference.setIcon(getEncircledGuestDrawable());
+ mMePreference.setTitle(R.string.user_exit_guest_title);
+ return;
+ }
+
new AsyncTask<Void, Void, String>() {
@Override
protected void onPostExecute(String result) {
mUserManager.setUserRestriction(UserManager.DISALLOW_SHARE_LOCATION, true, user);
Secure.putIntForUser(getContentResolver(),
Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF, userId);
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- UserSettings.USER_DRAWABLES[
- userId % UserSettings.USER_DRAWABLES.length]);
+ Bitmap bitmap = createBitmapFromDrawable(
+ USER_DRAWABLES[userId % UserSettings.USER_DRAWABLES.length]);
mUserManager.setUserIcon(userId, bitmap);
// Add shared accounts
AccountManager am = AccountManager.get(getActivity());
return newUserInfo;
}
+ private Bitmap createBitmapFromDrawable(int resId) {
+ Drawable icon = getResources().getDrawable(resId);
+ icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
+ Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), icon.getIntrinsicHeight(),
+ Bitmap.Config.ARGB_8888);
+ icon.draw(new Canvas(bitmap));
+ return bitmap;
+ }
+
private UserInfo createTrustedUser() {
UserInfo newUserInfo = mUserManager.createUser(
getResources().getString(R.string.user_new_user_name), 0);
.create();
return dlg;
}
+ case DIALOG_CONFIRM_EXIT_GUEST: {
+ Dialog dlg = new AlertDialog.Builder(context)
+ .setTitle(R.string.user_exit_guest_confirm_title)
+ .setMessage(R.string.user_exit_guest_confirm_message)
+ .setPositiveButton(android.R.string.yes,
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ exitGuest();
+ }
+ })
+ .setNegativeButton(android.R.string.no, null)
+ .create();
+ return dlg;
+ }
default:
return null;
}
}
}
+ /**
+ * Erase the current user (guest) and switch to another user.
+ */
+ private void exitGuest() {
+ // Just to be safe
+ if (!mIsGuest) {
+ return;
+ }
+ removeThisUser();
+ }
+
private void updateUserList() {
if (getActivity() == null) return;
List<UserInfo> users = mUserManager.getUsers(true);
if (user.iconPath != null) {
if (mUserIcons.get(user.id) == null) {
missingIcons.add(user.id);
- pref.setIcon(encircle(R.drawable.avatar_default_1));
+ pref.setIcon(getEncircledDefaultAvatar());
} else {
setPhotoId(pref, user);
}
null, null);
pref.setEnabled(false);
pref.setTitle(R.string.user_new_user_name);
- pref.setIcon(encircle(R.drawable.avatar_default_1));
+ pref.setIcon(getEncircledDefaultAvatar());
mUserListCategory.addPreference(pref);
}
Preference pref = new UserPreference(getActivity(), null,
UserPreference.USERID_GUEST_DEFAULTS, mIsOwner ? this : null, null);
pref.setTitle(R.string.user_guest);
- pref.setIcon(encircle(R.drawable.ic_settings_accounts));
+ pref.setIcon(getEncircledGuestDrawable());
pref.setOnPreferenceClickListener(this);
mUserListCategory.addPreference(pref);
}
}
private void assignDefaultPhoto(UserInfo user) {
- Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
- USER_DRAWABLES[user.id % USER_DRAWABLES.length]);
+ Bitmap bitmap = createBitmapFromDrawable(
+ USER_DRAWABLES[user.id % UserSettings.USER_DRAWABLES.length]);
mUserManager.setUserIcon(user.id, bitmap);
}
+ private Drawable getEncircledGuestDrawable() {
+ if (mGuestDrawable == null) {
+ mGuestDrawable = encircle(createBitmapFromDrawable(GUEST_DRAWABLE_ID));
+ }
+ return mGuestDrawable;
+ }
+
+ private Drawable getEncircledDefaultAvatar() {
+ if (mDefaultAvatarDrawable == null) {
+ mDefaultAvatarDrawable =
+ encircle(createBitmapFromDrawable(R.drawable.ic_avatar_default_1));
+ }
+ return mDefaultAvatarDrawable;
+ }
+
private void setPhotoId(Preference pref, UserInfo user) {
Bitmap bitmap = mUserIcons.get(user.id);
if (bitmap != null) {
@Override
public boolean onPreferenceClick(Preference pref) {
if (pref == mMePreference) {
+ if (mIsGuest) {
+ showDialog(DIALOG_CONFIRM_EXIT_GUEST);
+ return true;
+ }
Intent editProfile;
if (!mProfileExists) {
editProfile = new Intent(Intent.ACTION_INSERT, Contacts.CONTENT_URI);