/* * Copyright (C) 2013 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. */ package com.android.settings.users; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.Fragment; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.UserInfo; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.EditText; import android.widget.ImageView; import com.android.settings.R; import com.android.settingslib.Utils; import com.android.settingslib.drawable.CircleFramedDrawable; import java.io.File; /** * This class encapsulates a Dialog for editing the user nickname and photo. */ public class EditUserInfoController { private static final String KEY_AWAITING_RESULT = "awaiting_result"; private static final String KEY_SAVED_PHOTO = "pending_photo"; private Dialog mEditUserInfoDialog; private Bitmap mSavedPhoto; private EditUserPhotoController mEditUserPhotoController; private UserHandle mUser; private UserManager mUserManager; private boolean mWaitingForActivityResult = false; public interface OnContentChangedCallback { public void onPhotoChanged(Drawable photo); public void onLabelChanged(CharSequence label); } public void clear() { mEditUserPhotoController.removeNewUserPhotoBitmapFile(); mEditUserInfoDialog = null; mSavedPhoto = null; } public Dialog getDialog() { return mEditUserInfoDialog; } public void onRestoreInstanceState(Bundle icicle) { String pendingPhoto = icicle.getString(KEY_SAVED_PHOTO); if (pendingPhoto != null) { mSavedPhoto = EditUserPhotoController.loadNewUserPhotoBitmap(new File(pendingPhoto)); } mWaitingForActivityResult = icicle.getBoolean(KEY_AWAITING_RESULT, false); } public void onSaveInstanceState(Bundle outState) { if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing() && mEditUserPhotoController != null) { // Bitmap cannot be stored into bundle because it may exceed parcel limit // Store it in a temporary file instead File file = mEditUserPhotoController.saveNewUserPhotoBitmap(); if (file != null) { outState.putString(KEY_SAVED_PHOTO, file.getPath()); } } if (mWaitingForActivityResult) { outState.putBoolean(KEY_AWAITING_RESULT, mWaitingForActivityResult); } } public void startingActivityForResult() { mWaitingForActivityResult = true; } public void onActivityResult(int requestCode, int resultCode, Intent data) { mWaitingForActivityResult = false; if (mEditUserInfoDialog != null && mEditUserInfoDialog.isShowing() && mEditUserPhotoController.onActivityResult(requestCode, resultCode, data)) { return; } } public Dialog createDialog(final Fragment fragment, final Drawable currentUserIcon, final CharSequence currentUserName, int titleResId, final OnContentChangedCallback callback, UserHandle user) { Activity activity = fragment.getActivity(); mUser = user; if (mUserManager == null) { mUserManager = UserManager.get(activity); } LayoutInflater inflater = activity.getLayoutInflater(); View content = inflater.inflate(R.layout.edit_user_info_dialog_content, null); UserInfo info = mUserManager.getUserInfo(mUser.getIdentifier()); final EditText userNameView = (EditText) content.findViewById(R.id.user_name); userNameView.setText(info.name); final ImageView userPhotoView = (ImageView) content.findViewById(R.id.user_photo); Drawable drawable = null; if (mSavedPhoto != null) { drawable = CircleFramedDrawable.getInstance(activity, mSavedPhoto); } else { drawable = currentUserIcon; if (drawable == null) { drawable = Utils.getUserIcon(activity, mUserManager, info); } } userPhotoView.setImageDrawable(drawable); mEditUserPhotoController = new EditUserPhotoController(fragment, userPhotoView, mSavedPhoto, drawable, mWaitingForActivityResult); mEditUserInfoDialog = new AlertDialog.Builder(activity) .setTitle(R.string.profile_info_settings_title) .setView(content) .setCancelable(true) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { // Update the name if changed. CharSequence userName = userNameView.getText(); if (!TextUtils.isEmpty(userName)) { if (currentUserName == null || !userName.toString().equals(currentUserName.toString())) { if (callback != null) { callback.onLabelChanged(userName.toString()); } mUserManager.setUserName(mUser.getIdentifier(), userName.toString()); } } // Update the photo if changed. Drawable drawable = mEditUserPhotoController.getNewUserPhotoDrawable(); Bitmap bitmap = mEditUserPhotoController.getNewUserPhotoBitmap(); if (drawable != null && bitmap != null && !drawable.equals(currentUserIcon)) { if (callback != null) { callback.onPhotoChanged(drawable); } new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { mUserManager.setUserIcon(mUser.getIdentifier(), mEditUserPhotoController.getNewUserPhotoBitmap()); return null; } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); } fragment.getActivity().removeDialog( RestrictedProfileSettings.DIALOG_ID_EDIT_USER_INFO); } clear(); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { clear(); } }) .create(); // Make sure the IME is up. mEditUserInfoDialog.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); return mEditUserInfoDialog; } }