Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d6d7420 authored by Amith Yamasani's avatar Amith Yamasani Committed by Android Git Automerger
Browse files

am a6760474: am f7a6dfca: Merge "Pass Bitmap instead of ParcelFileDescriptor...

am a6760474: am f7a6dfca: Merge "Pass Bitmap instead of ParcelFileDescriptor in UserManager" into jb-mr1-dev

* commit 'a6760474':
  Pass Bitmap instead of ParcelFileDescriptor in UserManager
parents b7555d8e a6760474
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -2376,6 +2376,16 @@ public class Intent implements Parcelable, Cloneable {
    public static final String ACTION_USER_SWITCHED =
            "android.intent.action.USER_SWITCHED";

    /**
     * Broadcast sent to the system when a user's information changes. Carries an extra
     * {@link #EXTRA_USER_HANDLE} to indicate which user's information changed.
     * This is only sent to registered receivers, not manifest receivers. It is sent to the user
     * whose information has changed.
     * @hide
     */
    public static final String ACTION_USER_INFO_CHANGED =
            "android.intent.action.USER_INFO_CHANGED";

    // ---------------------------------------------------------------------
    // ---------------------------------------------------------------------
    // Standard intent categories (see addCategory()).
+3 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.os;

import android.os.ParcelFileDescriptor;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;

/**
 *  {@hide}
@@ -27,8 +28,8 @@ interface IUserManager {
    UserInfo createUser(in String name, int flags);
    boolean removeUser(int userHandle);
    void setUserName(int userHandle, String name);
    ParcelFileDescriptor setUserIcon(int userHandle);
    ParcelFileDescriptor getUserIcon(int userHandle);
    void setUserIcon(int userHandle, in Bitmap icon);
    Bitmap getUserIcon(int userHandle);
    List<UserInfo> getUsers();
    UserInfo getUserInfo(int userHandle);
    void setGuestEnabled(boolean enable);
+9 −9
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.os;
import com.android.internal.R;
import android.content.Context;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;
import android.util.Log;

import java.util.List;
@@ -40,6 +41,7 @@ public class UserManager {
    /**
     * Returns whether the system supports multiple users.
     * @return true if multiple users can be created, false if it is a single user device.
     * @hide
     */
    public boolean supportsMultipleUsers() {
        return getMaxSupportedUsers() > 1;
@@ -152,32 +154,30 @@ public class UserManager {
    }

    /**
     * Returns a file descriptor for the user's photo. PNG data can be written into this file.
     * Sets the user's photo.
     * @param userHandle the user for whom to change the photo.
     * @return a {@link ParcelFileDescriptor} to which to write the photo.
     * @param icon the bitmap to set as the photo.
     * @hide
     */
    public ParcelFileDescriptor setUserIcon(int userHandle) {
    public void setUserIcon(int userHandle, Bitmap icon) {
        try {
            return mService.setUserIcon(userHandle);
            mService.setUserIcon(userHandle, icon);
        } catch (RemoteException re) {
            Log.w(TAG, "Could not set the user icon ", re);
            return null;
        }
    }

    /**
     * Returns a file descriptor for the user's photo. PNG data can be read from this file.
     * @param userHandle the user whose photo we want to read.
     * @return a {@link ParcelFileDescriptor} from which to read the file, or null if there's no
     * photo.
     * @return a {@link Bitmap} of the user's photo, or null if there's no photo.
     * @hide
     */
    public ParcelFileDescriptor getUserIcon(int userHandle) {
    public Bitmap getUserIcon(int userHandle) {
        try {
            return mService.getUserIcon(userHandle);
        } catch (RemoteException re) {
            Log.w(TAG, "Could not set the user icon ", re);
            Log.w(TAG, "Could not get the user icon ", re);
            return null;
        }
    }
+25 −16
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Binder;
import android.os.Environment;
import android.os.FileUtils;
@@ -188,30 +190,35 @@ public class UserManagerService extends IUserManager.Stub {
                writeUserLocked(info);
            }
        }
        sendUserInfoChangedBroadcast(userId);
    }

    @Override
    public ParcelFileDescriptor setUserIcon(int userId) {
    public void setUserIcon(int userId, Bitmap bitmap) {
        checkManageUsersPermission("update users");
        synchronized (mPackagesLock) {
            UserInfo info = mUsers.get(userId);
            if (info == null) return null;
            ParcelFileDescriptor fd = openIconBitmapLocked(info, true /* write */);
            if (fd != null) {
            if (info == null) return;
            writeBitmapLocked(info, bitmap);
            writeUserLocked(info);
        }
            return fd;
        sendUserInfoChangedBroadcast(userId);
    }

    private void sendUserInfoChangedBroadcast(int userId) {
        Intent changedIntent = new Intent(Intent.ACTION_USER_INFO_CHANGED);
        changedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
        changedIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
        mContext.sendBroadcastAsUser(changedIntent, new UserHandle(userId));
    }

    @Override
    public ParcelFileDescriptor getUserIcon(int userId) {
    public Bitmap getUserIcon(int userId) {
        checkManageUsersPermission("read users");
        synchronized (mPackagesLock) {
            UserInfo info = mUsers.get(userId);
            if (info == null || info.iconPath == null) return null;
            ParcelFileDescriptor fd = openIconBitmapLocked(info, false /* read */);
            return fd;
            return BitmapFactory.decodeFile(info.iconPath);
        }
    }

@@ -289,7 +296,7 @@ public class UserManagerService extends IUserManager.Stub {
        }
    }

    private ParcelFileDescriptor openIconBitmapLocked(UserInfo info, boolean toWrite) {
    private void writeBitmapLocked(UserInfo info, Bitmap bitmap) {
        try {
            File dir = new File(mUsersDir, Integer.toString(info.id));
            File file = new File(dir, USER_PHOTO_FILENAME);
@@ -300,16 +307,18 @@ public class UserManagerService extends IUserManager.Stub {
                        FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
                        -1, -1);
            }
            ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,
                    toWrite ? MODE_CREATE|MODE_READ_WRITE : MODE_READ_WRITE);
            if (toWrite) {
            FileOutputStream os;
            if (bitmap.compress(Bitmap.CompressFormat.PNG, 100, os = new FileOutputStream(file))) {
                info.iconPath = file.getAbsolutePath();
            }
            return fd;
            try {
                os.close();
            } catch (IOException ioe) {
                // What the ... !
            }
        } catch (FileNotFoundException e) {
            Slog.w(LOG_TAG, "Error setting photo for user ", e);
        }
        return null;
    }

    /**