Added the launching account page

Settings get account name and account avatar from SI.
According the account name to launch the account page.

Bug: 119608711
Test: robotest
Change-Id: I0d53e9445f4ba5ce470bd079038db0f08f0cc1c8
This commit is contained in:
Sunny Shao
2018-11-16 11:16:35 +08:00
parent f8a2304da4
commit 408dc883f7
2 changed files with 58 additions and 11 deletions

View File

@@ -55,27 +55,37 @@ public class AvatarViewMixin implements LifecycleObserver {
private static final String METHOD_GET_ACCOUNT_AVATAR = "getAccountAvatar"; private static final String METHOD_GET_ACCOUNT_AVATAR = "getAccountAvatar";
private static final String KEY_AVATAR_BITMAP = "account_avatar"; private static final String KEY_AVATAR_BITMAP = "account_avatar";
private static final String KEY_ACCOUNT_NAME = "account_name";
private static final String EXTRA_ACCOUNT_NAME = "extra.accountName";
private static final int REQUEST_CODE = 1013; private static final int REQUEST_CODE = 1013;
private final Context mContext; private final Context mContext;
private final ImageView mAvatarView; private final ImageView mAvatarView;
private final MutableLiveData<Bitmap> mAvatarImage; private final MutableLiveData<Bitmap> mAvatarImage;
private String mAccountName;
public AvatarViewMixin(SettingsHomepageActivity activity, ImageView avatarView) { public AvatarViewMixin(SettingsHomepageActivity activity, ImageView avatarView) {
mContext = activity.getApplicationContext(); mContext = activity.getApplicationContext();
mAvatarView = avatarView; mAvatarView = avatarView;
mAvatarView.setOnClickListener(v -> { mAvatarView.setOnClickListener(v -> {
if (hasAccount()) {
//TODO(b/117509285) launch the new page of the MeCard
} else {
final Intent intent = FeatureFactory.getFactory(mContext) final Intent intent = FeatureFactory.getFactory(mContext)
.getAccountFeatureProvider() .getAccountFeatureProvider()
.getAccountSettingsDeeplinkIntent(); .getAccountSettingsDeeplinkIntent();
if (intent != null) { if (intent == null) {
return;
}
if (!TextUtils.isEmpty(mAccountName)) {
//TODO(b/117509285) launch the new page of the MeCard
intent.putExtra(EXTRA_ACCOUNT_NAME, mAccountName);
}
// Here may have two different UI while start the activity.
// It will display adding account UI when device has no any account.
// It will display account information page when intent added the specified account.
activity.startActivityForResult(intent, REQUEST_CODE); activity.startActivityForResult(intent, REQUEST_CODE);
}
}
}); });
mAvatarImage = new MutableLiveData<>(); mAvatarImage = new MutableLiveData<>();
@@ -91,7 +101,7 @@ public class AvatarViewMixin implements LifecycleObserver {
return; return;
} }
if (hasAccount()) { if (hasAccount()) {
loadAvatar(); loadAccount();
} else { } else {
mAvatarView.setImageResource(R.drawable.ic_account_circle_24dp); mAvatarView.setImageResource(R.drawable.ic_account_circle_24dp);
} }
@@ -104,7 +114,7 @@ public class AvatarViewMixin implements LifecycleObserver {
return (accounts != null) && (accounts.length > 0); return (accounts != null) && (accounts.length > 0);
} }
private void loadAvatar() { private void loadAccount() {
final String authority = queryProviderAuthority(); final String authority = queryProviderAuthority();
if (TextUtils.isEmpty(authority)) { if (TextUtils.isEmpty(authority)) {
return; return;
@@ -117,6 +127,7 @@ public class AvatarViewMixin implements LifecycleObserver {
final Bundle bundle = mContext.getContentResolver().call(uri, final Bundle bundle = mContext.getContentResolver().call(uri,
METHOD_GET_ACCOUNT_AVATAR, null /* arg */, null /* extras */); METHOD_GET_ACCOUNT_AVATAR, null /* arg */, null /* extras */);
final Bitmap bitmap = bundle.getParcelable(KEY_AVATAR_BITMAP); final Bitmap bitmap = bundle.getParcelable(KEY_AVATAR_BITMAP);
mAccountName = bundle.getString(KEY_ACCOUNT_NAME, "" /* defaultValue */);
mAvatarImage.postValue(bitmap); mAvatarImage.postValue(bitmap);
}); });
} }

View File

@@ -18,16 +18,25 @@ package com.android.settings.accounts;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.accounts.Account; import android.accounts.Account;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ImageView; import android.widget.ImageView;
import com.android.settings.homepage.SettingsHomepageActivity; import com.android.settings.homepage.SettingsHomepageActivity;
@@ -44,6 +53,7 @@ import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import org.robolectric.shadow.api.Shadow; import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowContentResolver;
import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.shadows.ShadowPackageManager;
@RunWith(SettingsRobolectricTestRunner.class) @RunWith(SettingsRobolectricTestRunner.class)
@@ -51,6 +61,7 @@ public class AvatarViewMixinTest {
private static final String DUMMY_ACCOUNT = "test@domain.com"; private static final String DUMMY_ACCOUNT = "test@domain.com";
private static final String DUMMY_DOMAIN = "domain.com"; private static final String DUMMY_DOMAIN = "domain.com";
private static final String DUMMY_AUTHORITY = "authority.domain.com"; private static final String DUMMY_AUTHORITY = "authority.domain.com";
private static final String METHOD_GET_ACCOUNT_AVATAR = "getAccountAvatar";
private Context mContext; private Context mContext;
private ImageView mImageView; private ImageView mImageView;
@@ -128,6 +139,31 @@ public class AvatarViewMixinTest {
assertThat(avatarViewMixin.queryProviderAuthority()).isEqualTo(DUMMY_AUTHORITY); assertThat(avatarViewMixin.queryProviderAuthority()).isEqualTo(DUMMY_AUTHORITY);
} }
@Test
public void callWithGetAccountAvatarMethod_useDummyData_shouldReturnAccountNameAndAvatar() {
final ShadowContentResolver shadowContentResolver = Shadow.extract(
mContext.getContentResolver());
final Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(
DUMMY_AUTHORITY).build();
final ContentProvider mockContentProvider = mock(ContentProvider.class);
ShadowContentResolver.registerProviderInternal(DUMMY_AUTHORITY, mockContentProvider);
final Bundle bundle = new Bundle();
final Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
bundle.putParcelable("account_avatar", bitmap);
bundle.putString("account_name", DUMMY_ACCOUNT);
doReturn(bundle).when(mockContentProvider).call(anyString(), anyString(),
any(Bundle.class));
final Bundle expectBundle = shadowContentResolver.call(uri, METHOD_GET_ACCOUNT_AVATAR,
null /* arg */, null /* extras */);
final Object object = bundle.getParcelable("account_avatar");
assertThat(object instanceof Bitmap).isTrue();
assertThat(bundle.getString("account_name")).isEqualTo(DUMMY_ACCOUNT);
}
@Implements(value = AccountFeatureProviderImpl.class) @Implements(value = AccountFeatureProviderImpl.class)
public static class ShadowAccountFeatureProviderImpl { public static class ShadowAccountFeatureProviderImpl {