1/* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.car.settings.accounts; 18 19import android.accounts.Account; 20import android.car.user.CarUserManagerHelper; 21import android.content.pm.UserInfo; 22import android.os.Bundle; 23import android.os.UserHandle; 24import android.view.View; 25import android.widget.Button; 26 27import androidx.car.widget.ListItemProvider; 28 29import com.android.car.settings.R; 30import com.android.car.settings.common.ListItemSettingsFragment; 31import com.android.settingslib.accounts.AuthenticatorHelper; 32 33/** 34 * Shows current user and the accounts that belong to the user. 35 */ 36public class AccountsListFragment extends ListItemSettingsFragment 37 implements AuthenticatorHelper.OnAccountsUpdateListener, 38 CarUserManagerHelper.OnUsersUpdateListener, 39 AccountsItemProvider.AccountClickListener { 40 private AccountsItemProvider mItemProvider; 41 private AccountManagerHelper mAccountManagerHelper; 42 private CarUserManagerHelper mCarUserManagerHelper; 43 44 private Button mAddAccountButton; 45 46 /** 47 * Creates new instance of CurrentUserDetailsFragment. 48 */ 49 public static AccountsListFragment newInstance() { 50 AccountsListFragment accountsFragment = new AccountsListFragment(); 51 Bundle bundle = ListItemSettingsFragment.getBundle(); 52 bundle.putInt(EXTRA_TITLE_ID, R.string.accounts_settings_title); 53 bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button); 54 accountsFragment.setArguments(bundle); 55 return accountsFragment; 56 } 57 58 @Override 59 public void onActivityCreated(Bundle savedInstanceState) { 60 mAccountManagerHelper = new AccountManagerHelper(getContext(), this); 61 mAccountManagerHelper.startListeningToAccountUpdates(); 62 63 mCarUserManagerHelper = new CarUserManagerHelper(getContext()); 64 mItemProvider = new AccountsItemProvider(getContext(), this, 65 mCarUserManagerHelper, mAccountManagerHelper); 66 67 // Register to receive changes to the users. 68 mCarUserManagerHelper.registerOnUsersUpdateListener(this); 69 70 // Super class's onActivityCreated need to be called after mContext is initialized. 71 // Because getLineItems is called in there. 72 super.onActivityCreated(savedInstanceState); 73 74 mAddAccountButton = (Button) getActivity().findViewById(R.id.action_button1); 75 if (mCarUserManagerHelper.canCurrentProcessModifyAccounts()) { 76 mAddAccountButton.setText(R.string.user_add_account_menu); 77 mAddAccountButton.setOnClickListener(v -> onAddAccountClicked()); 78 } else { 79 mAddAccountButton.setVisibility(View.GONE); 80 } 81 } 82 83 @Override 84 public void onDestroy() { 85 super.onDestroy(); 86 mCarUserManagerHelper.unregisterOnUsersUpdateListener(); 87 mAccountManagerHelper.stopListeningToAccountUpdates(); 88 89 // The action button may be hidden at some point, so make it visible again 90 mAddAccountButton.setVisibility(View.VISIBLE); 91 } 92 93 @Override 94 public void onAccountsUpdate(UserHandle userHandle) { 95 refreshListItems(); 96 } 97 98 @Override 99 public void onUsersUpdate() { 100 refreshListItems(); 101 } 102 103 @Override 104 public void onAccountClicked(Account account, UserInfo userInfo) { 105 getFragmentController().launchFragment( 106 AccountDetailsFragment.newInstance(account, userInfo)); 107 } 108 109 @Override 110 public ListItemProvider getItemProvider() { 111 return mItemProvider; 112 } 113 114 private void refreshListItems() { 115 mItemProvider.refreshItems(); 116 refreshList(); 117 } 118 119 private void onAddAccountClicked() { 120 getFragmentController().launchFragment(ChooseAccountFragment.newInstance()); 121 } 122} 123