| Index: chrome/android/java/src/org/chromium/chrome/browser/firstrun/ProfileDataCache.java
|
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ProfileDataCache.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ProfileDataCache.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1e6bdb038df187f62b804cf2d7fd6045ee3d8308
|
| --- /dev/null
|
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ProfileDataCache.java
|
| @@ -0,0 +1,181 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.firstrun;
|
| +
|
| +import android.accounts.Account;
|
| +import android.app.Activity;
|
| +import android.graphics.Bitmap;
|
| +import android.graphics.Bitmap.Config;
|
| +import android.graphics.BitmapFactory;
|
| +import android.graphics.Canvas;
|
| +import android.graphics.Color;
|
| +import android.graphics.Paint;
|
| +import android.graphics.PorterDuff.Mode;
|
| +import android.graphics.PorterDuffXfermode;
|
| +import android.graphics.Rect;
|
| +
|
| +import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.profiles.Profile;
|
| +import org.chromium.chrome.browser.profiles.ProfileDownloader;
|
| +import org.chromium.chrome.browser.profiles.ProfileDownloader.Observer;
|
| +import org.chromium.sync.signin.AccountManagerHelper;
|
| +import org.chromium.ui.gfx.DeviceDisplayInfo;
|
| +
|
| +import java.util.HashMap;
|
| +
|
| +/**
|
| + * Fetches and caches Google Account profile images and full names for the accounts on the device.
|
| + */
|
| +public class ProfileDataCache implements Observer {
|
| +
|
| + private static final int PROFILE_IMAGE_SIZE_DP = 136; // Max size of the user picture.
|
| + private static final int PROFILE_IMAGE_STROKE_DP = 3;
|
| +
|
| + private static class CacheEntry {
|
| + public CacheEntry(Bitmap picture, String fullName, String givenName) {
|
| + this.picture = picture;
|
| + this.fullName = fullName;
|
| + this.givenName = givenName;
|
| + }
|
| +
|
| + public Bitmap picture;
|
| + public String fullName;
|
| + public String givenName;
|
| + }
|
| +
|
| + private final HashMap<String, CacheEntry> mCacheEntries = new HashMap<String, CacheEntry>();
|
| +
|
| + private final Bitmap mPlaceholderImage;
|
| + private final int mImageSizePx;
|
| + private final int mImageStrokePx;
|
| + private final int mImageStrokeColor;
|
| + private Observer mObserver;
|
| +
|
| + private final Activity mActivity;
|
| + private Profile mProfile;
|
| +
|
| + public ProfileDataCache(Activity activity, Profile profile) {
|
| + ProfileDownloader.addObserver(this);
|
| +
|
| + mActivity = activity;
|
| + mProfile = profile;
|
| +
|
| + final DeviceDisplayInfo info = DeviceDisplayInfo.create(activity);
|
| + mImageSizePx = (int) Math.ceil(PROFILE_IMAGE_SIZE_DP * info.getDIPScale());
|
| + mImageStrokePx = (int) Math.ceil(PROFILE_IMAGE_STROKE_DP * info.getDIPScale());
|
| + mImageStrokeColor = Color.WHITE;
|
| +
|
| + Bitmap placeHolder = BitmapFactory.decodeResource(mActivity.getResources(),
|
| + R.drawable.fre_placeholder);
|
| + mPlaceholderImage = getCroppedBitmap(placeHolder);
|
| +
|
| + update();
|
| + }
|
| +
|
| + /**
|
| + * Sets the profile to use for the fetcher and triggers the update.
|
| + * @param profile A profile to use.
|
| + */
|
| + public void setProfile(Profile profile) {
|
| + mProfile = profile;
|
| + update();
|
| + }
|
| +
|
| + /**
|
| + * Initiate fetching the user accounts data (images and the full name).
|
| + * Fetched data will be sent to observers of ProfileDownloader.
|
| + */
|
| + public void update() {
|
| + if (mProfile == null) return;
|
| +
|
| + Account[] accounts = AccountManagerHelper.get(mActivity).getGoogleAccounts();
|
| + for (int i = 0; i < accounts.length; i++) {
|
| + if (mCacheEntries.get(accounts[i].name) == null) {
|
| + ProfileDownloader.startFetchingAccountInfoFor(
|
| + mProfile, accounts[i].name, mImageSizePx);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param accountId Google account ID for the image that is requested.
|
| + * @return Returns the profile image for a given Google account ID if it's in
|
| + * the cache, otherwise returns a placeholder image.
|
| + */
|
| + public Bitmap getImage(String accountId) {
|
| + CacheEntry cacheEntry = mCacheEntries.get(accountId);
|
| + if (cacheEntry == null) return mPlaceholderImage;
|
| + return cacheEntry.picture;
|
| + }
|
| +
|
| + /**
|
| + * @param accountId Google account ID for the full name that is requested.
|
| + * @return Returns the full name for a given Google account ID if it is
|
| + * the cache, otherwise returns null.
|
| + */
|
| + public String getFullName(String accountId) {
|
| + CacheEntry cacheEntry = mCacheEntries.get(accountId);
|
| + if (cacheEntry == null) return null;
|
| + return cacheEntry.fullName;
|
| + }
|
| +
|
| + /**
|
| + * @param accountId Google account ID for the full name that is requested.
|
| + * @return Returns the given name for a given Google account ID if it is in the cache, otherwise
|
| + * returns null.
|
| + */
|
| + public String getGivenName(String accountId) {
|
| + CacheEntry cacheEntry = mCacheEntries.get(accountId);
|
| + if (cacheEntry == null) return null;
|
| + return cacheEntry.givenName;
|
| + }
|
| +
|
| + public void onDestroy() {
|
| + ProfileDownloader.removeObserver(this);
|
| + mObserver = null;
|
| + }
|
| +
|
| + @Override
|
| + public void onProfileDownloaded(String accountId, String fullName, String givenName,
|
| + Bitmap bitmap) {
|
| + bitmap = getCroppedBitmap(bitmap);
|
| + mCacheEntries.put(accountId, new CacheEntry(bitmap, fullName, givenName));
|
| + if (mObserver != null) mObserver.onProfileDownloaded(accountId, givenName, fullName,
|
| + bitmap);
|
| + }
|
| +
|
| + private Bitmap getCroppedBitmap(Bitmap bitmap) {
|
| + Bitmap output = Bitmap.createBitmap(
|
| + bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
|
| + Canvas canvas = new Canvas(output);
|
| +
|
| + final Paint paint = new Paint();
|
| + final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
|
| +
|
| + paint.setAntiAlias(true);
|
| + canvas.drawARGB(0, 0, 0, 0);
|
| + paint.setColor(Color.WHITE);
|
| +
|
| + final float radius = (bitmap.getWidth() - mImageStrokePx) / 2f;
|
| + canvas.drawCircle(bitmap.getWidth() / 2f, bitmap.getHeight() / 2f, radius, paint);
|
| + paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
|
| + canvas.drawBitmap(bitmap, rect, rect, paint);
|
| +
|
| + paint.setColor(mImageStrokeColor);
|
| + paint.setStyle(Paint.Style.STROKE);
|
| + paint.setXfermode(new PorterDuffXfermode(Mode.SRC));
|
| + paint.setStrokeWidth(mImageStrokePx);
|
| + canvas.drawCircle(bitmap.getWidth() / 2f, bitmap.getHeight() / 2f, radius, paint);
|
| +
|
| + return output;
|
| + }
|
| +
|
| + /**
|
| + * @param observer Observer that should be notified when new profile images are available.
|
| + */
|
| + public void setObserver(Observer observer) {
|
| + mObserver = observer;
|
| + }
|
| +}
|
|
|