// 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.VoidResult; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.Natives; import com.google.gerrit.client.ui.FancyFlexTable; import com.google.gwt.core.client.JsArray; 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.HashSet; import java.util.List; 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.info().auth().isOpenId() || Gerrit.info().auth().isOAuth()) { 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(); AccountApi.getExternalIds( new GerritCallback<JsArray<ExternalIdInfo>>() { @Override public void onSuccess(JsArray<ExternalIdInfo> results) { identites.display(results); display(); } }); } private class IdTable extends FancyFlexTable<ExternalIdInfo> { 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<String> keys = new HashSet<>(); for (int row = 1; row < table.getRowCount(); row++) { final ExternalIdInfo 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.identity()); } } if (keys.isEmpty()) { updateDeleteButton(); } else { deleteIdentity.setEnabled(false); AccountApi.deleteExternalIds( keys, new GerritCallback<VoidResult>() { @Override public void onSuccess(VoidResult result) { for (int row = 1; row < table.getRowCount(); ) { final ExternalIdInfo k = getRowItem(row); if (k != null && keys.contains(k.identity())) { 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 JsArray<ExternalIdInfo> results) { List<ExternalIdInfo> idList = Natives.asList(results); Collections.sort(idList); while (1 < table.getRowCount()) { table.removeRow(table.getRowCount() - 1); } for (final ExternalIdInfo k : idList) { addOneId(k); } updateDeleteButton(); } void addOneId(final ExternalIdInfo k) { if (k.isUsername()) { // 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.emailAddress() != null && k.emailAddress().length() > 0) { table.setText(row, 3, k.emailAddress()); } else { table.setText(row, 3, ""); } table.setText(row, 4, k.describe()); 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); } } }