// Copyright (C) 2008 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.google.gerrit.client.account; import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.auth.openid.OpenIdUtil; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.ScreenLoadCallback; import com.google.gerrit.client.ui.FancyFlexTable; import com.google.gerrit.common.auth.openid.OpenIdUrls; import com.google.gerrit.reviewdb.client.AccountExternalId; import com.google.gerrit.reviewdb.client.AuthType; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.History; import com.google.gwt.user.client.Window.Location; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; public class MyIdentitiesScreen extends SettingsScreen { private IdTable identites; private Button deleteIdentity; @Override protected void onInitUI() { super.onInitUI(); identites = new IdTable(); add(identites); deleteIdentity = new Button(Util.C.buttonDeleteIdentity()); deleteIdentity.setEnabled(false); deleteIdentity.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { identites.deleteChecked(); } }); add(deleteIdentity); if (Gerrit.getConfig().getAuthType() == AuthType.OPENID) { Button linkIdentity = new Button(Util.C.buttonLinkIdentity()); linkIdentity.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent event) { Location.assign(Gerrit.loginRedirect(History.getToken()) + "?link"); } }); add(linkIdentity); } } @Override protected void onLoad() { super.onLoad(); Util.ACCOUNT_SEC .myExternalIds(new ScreenLoadCallback<List<AccountExternalId>>(this) { public void preDisplay(final List<AccountExternalId> result) { identites.display(result); } }); } private class IdTable extends FancyFlexTable<AccountExternalId> { private ValueChangeHandler<Boolean> updateDeleteHandler; IdTable() { table.setWidth(""); table.setText(0, 2, Util.C.webIdStatus()); table.setText(0, 3, Util.C.webIdEmail()); table.setText(0, 4, Util.C.webIdIdentity()); final FlexCellFormatter fmt = table.getFlexCellFormatter(); fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().iconHeader()); fmt.addStyleName(0, 2, Gerrit.RESOURCES.css().dataHeader()); fmt.addStyleName(0, 3, Gerrit.RESOURCES.css().dataHeader()); fmt.addStyleName(0, 4, Gerrit.RESOURCES.css().dataHeader()); updateDeleteHandler = new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { updateDeleteButton(); } }; } void deleteChecked() { final HashSet<AccountExternalId.Key> keys = new HashSet<>(); for (int row = 1; row < table.getRowCount(); row++) { final AccountExternalId k = getRowItem(row); if (k == null) { continue; } final CheckBox cb = (CheckBox) table.getWidget(row, 1); if (cb == null) { continue; } if (cb.getValue()) { keys.add(k.getKey()); } } if (keys.isEmpty()) { updateDeleteButton(); } else { deleteIdentity.setEnabled(false); Util.ACCOUNT_SEC.deleteExternalIds(keys, new GerritCallback<Set<AccountExternalId.Key>>() { public void onSuccess(final Set<AccountExternalId.Key> removed) { for (int row = 1; row < table.getRowCount();) { final AccountExternalId k = getRowItem(row); if (k != null && removed.contains(k.getKey())) { table.removeRow(row); } else { row++; } } updateDeleteButton(); } @Override public void onFailure(Throwable caught) { updateDeleteButton(); super.onFailure(caught); } }); } } void updateDeleteButton() { int off = 0; boolean on = false; for (int row = 1; row < table.getRowCount(); row++) { if (table.getWidget(row, 1) == null) { off++; } else { CheckBox sel = (CheckBox) table.getWidget(row, 1); if (sel.getValue()) { on = true; break; } } } deleteIdentity.setVisible(off < table.getRowCount() - 1); deleteIdentity.setEnabled(on); } void display(final List<AccountExternalId> result) { Collections.sort(result, new Comparator<AccountExternalId>() { @Override public int compare(AccountExternalId a, AccountExternalId b) { return emailOf(a).compareTo(emailOf(b)); } private String emailOf(final AccountExternalId a) { return a.getEmailAddress() != null ? a.getEmailAddress() : ""; } }); while (1 < table.getRowCount()) table.removeRow(table.getRowCount() - 1); for (final AccountExternalId k : result) { addOneId(k); } updateDeleteButton(); } void addOneId(final AccountExternalId k) { if (k.isScheme(AccountExternalId.SCHEME_USERNAME)) { // Don't display the username as an identity here. return; } final FlexCellFormatter fmt = table.getFlexCellFormatter(); final int row = table.getRowCount(); table.insertRow(row); applyDataRowStyle(row); if (k.canDelete()) { final CheckBox sel = new CheckBox(); sel.addValueChangeHandler(updateDeleteHandler); table.setWidget(row, 1, sel); } else { table.setText(row, 1, ""); } if (k.isTrusted()) { table.setText(row, 2, ""); } else { table.setText(row, 2, Util.C.untrustedProvider()); fmt.addStyleName(row, 2, Gerrit.RESOURCES.css() .identityUntrustedExternalId()); } if (k.getEmailAddress() != null && k.getEmailAddress().length() > 0) { table.setText(row, 3, k.getEmailAddress()); } else { table.setText(row, 3, ""); } table.setText(row, 4, describe(k)); fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().iconCell()); fmt.addStyleName(row, 2, Gerrit.RESOURCES.css().dataCell()); fmt.addStyleName(row, 3, Gerrit.RESOURCES.css().dataCell()); fmt.addStyleName(row, 4, Gerrit.RESOURCES.css().dataCell()); setRowItem(row, k); } private String describe(final AccountExternalId k) { if (k.isScheme(AccountExternalId.SCHEME_GERRIT)) { // A local user identity should just be itself. // return k.getSchemeRest(); } else if (k.isScheme(AccountExternalId.SCHEME_USERNAME)) { // A local user identity should just be itself. // return k.getSchemeRest(); } else if (k.isScheme(AccountExternalId.SCHEME_MAILTO)) { // Describe a mailto address as just its email address, which // is already shown in the email address field. // return ""; } else if (k.isScheme(OpenIdUrls.URL_GOOGLE)) { return OpenIdUtil.C.nameGoogle(); } else if (k.isScheme(OpenIdUrls.URL_YAHOO)) { return OpenIdUtil.C.nameYahoo(); } else { return k.getExternalId(); } } } }