Add basic PEP managemend UI to EditAccountActivity
EditAccountActivity now show own fingerprint, and gives an option to regenerate local keying material (and wipe all sessions associated with the old keys in the process). It also now displays a list of other own devices, and gives an option to remove all but the current device.
This commit is contained in:
parent
968410ae33
commit
7049904c32
|
@ -176,6 +176,13 @@ public class AxolotlService {
|
||||||
return reg_id;
|
return reg_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void regenerate() {
|
||||||
|
mXmppConnectionService.databaseBackend.wipeAxolotlDb(account);
|
||||||
|
account.setKey(JSONKEY_CURRENT_PREKEY_ID, Integer.toString(0));
|
||||||
|
identityKeyPair = loadIdentityKeyPair();
|
||||||
|
currentPreKeyId = 0;
|
||||||
|
mXmppConnectionService.updateAccountUi();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the local client's identity key pair.
|
* Get the local client's identity key pair.
|
||||||
|
@ -602,6 +609,10 @@ public class AxolotlService {
|
||||||
this.ownDeviceId = axolotlStore.getLocalRegistrationId();
|
this.ownDeviceId = axolotlStore.getLocalRegistrationId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IdentityKey getOwnPublicKey() {
|
||||||
|
return axolotlStore.getIdentityKeyPair().getPublicKey();
|
||||||
|
}
|
||||||
|
|
||||||
public void trustSession(AxolotlAddress counterpart) {
|
public void trustSession(AxolotlAddress counterpart) {
|
||||||
XmppAxolotlSession session = sessions.get(counterpart);
|
XmppAxolotlSession session = sessions.get(counterpart);
|
||||||
if (session != null) {
|
if (session != null) {
|
||||||
|
@ -635,10 +646,19 @@ public class AxolotlService {
|
||||||
return sessions.hasAny(contactAddress);
|
return sessions.hasAny(contactAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void regenerateKeys() {
|
||||||
|
axolotlStore.regenerate();
|
||||||
|
publishBundlesIfNeeded();
|
||||||
|
}
|
||||||
|
|
||||||
public int getOwnDeviceId() {
|
public int getOwnDeviceId() {
|
||||||
return ownDeviceId;
|
return ownDeviceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<Integer> getOwnDeviceIds() {
|
||||||
|
return this.deviceIds.get(account.getJid().toBareJid());
|
||||||
|
}
|
||||||
|
|
||||||
public void registerDevices(final Jid jid, @NonNull final Set<Integer> deviceIds) {
|
public void registerDevices(final Jid jid, @NonNull final Set<Integer> deviceIds) {
|
||||||
if(deviceIds.contains(getOwnDeviceId())) {
|
if(deviceIds.contains(getOwnDeviceId())) {
|
||||||
Log.d(Config.LOGTAG, "Skipping own Device ID:"+ jid + ":"+getOwnDeviceId());
|
Log.d(Config.LOGTAG, "Skipping own Device ID:"+ jid + ":"+getOwnDeviceId());
|
||||||
|
@ -651,6 +671,19 @@ public class AxolotlService {
|
||||||
publishOwnDeviceIdIfNeeded();
|
publishOwnDeviceIdIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void wipeOtherPepDevices() {
|
||||||
|
Set<Integer> deviceIds = new HashSet<>();
|
||||||
|
deviceIds.add(getOwnDeviceId());
|
||||||
|
IqPacket publish = mXmppConnectionService.getIqGenerator().publishDeviceIds(deviceIds);
|
||||||
|
Log.d(Config.LOGTAG, "Wiping all other devices from Pep:" + publish);
|
||||||
|
mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
|
||||||
|
@Override
|
||||||
|
public void onIqPacketReceived(Account account, IqPacket packet) {
|
||||||
|
// TODO: implement this!
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public void publishOwnDeviceIdIfNeeded() {
|
public void publishOwnDeviceIdIfNeeded() {
|
||||||
IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveDeviceIds(account.getJid().toBareJid());
|
IqPacket packet = mXmppConnectionService.getIqGenerator().retrieveDeviceIds(account.getJid().toBareJid());
|
||||||
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
|
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
|
||||||
|
|
|
@ -874,4 +874,25 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
db.execSQL("DROP TABLE IF EXISTS " + AxolotlService.SQLiteAxolotlStore.IDENTITIES_TABLENAME);
|
db.execSQL("DROP TABLE IF EXISTS " + AxolotlService.SQLiteAxolotlStore.IDENTITIES_TABLENAME);
|
||||||
db.execSQL(CREATE_IDENTITIES_STATEMENT);
|
db.execSQL(CREATE_IDENTITIES_STATEMENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void wipeAxolotlDb(Account account) {
|
||||||
|
String accountName = account.getUuid();
|
||||||
|
Log.d(Config.LOGTAG, ">>> WIPING AXOLOTL DATABASE FOR ACCOUNT " + accountName + " <<<");
|
||||||
|
SQLiteDatabase db = this.getWritableDatabase();
|
||||||
|
String[] deleteArgs= {
|
||||||
|
accountName
|
||||||
|
};
|
||||||
|
db.delete(AxolotlService.SQLiteAxolotlStore.SESSION_TABLENAME,
|
||||||
|
AxolotlService.SQLiteAxolotlStore.ACCOUNT + " = ?",
|
||||||
|
deleteArgs);
|
||||||
|
db.delete(AxolotlService.SQLiteAxolotlStore.PREKEY_TABLENAME,
|
||||||
|
AxolotlService.SQLiteAxolotlStore.ACCOUNT + " = ?",
|
||||||
|
deleteArgs);
|
||||||
|
db.delete(AxolotlService.SQLiteAxolotlStore.SIGNED_PREKEY_TABLENAME,
|
||||||
|
AxolotlService.SQLiteAxolotlStore.ACCOUNT + " = ?",
|
||||||
|
deleteArgs);
|
||||||
|
db.delete(AxolotlService.SQLiteAxolotlStore.IDENTITIES_TABLENAME,
|
||||||
|
AxolotlService.SQLiteAxolotlStore.ACCOUNT + " = ?",
|
||||||
|
deleteArgs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
package eu.siacs.conversations.ui;
|
package eu.siacs.conversations.ui;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.AlertDialog.Builder;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
@ -23,6 +27,8 @@ import android.widget.TableLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.Account;
|
import eu.siacs.conversations.entities.Account;
|
||||||
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
|
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
|
||||||
|
@ -54,9 +60,16 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
|
||||||
private TextView mServerInfoPep;
|
private TextView mServerInfoPep;
|
||||||
private TextView mSessionEst;
|
private TextView mSessionEst;
|
||||||
private TextView mOtrFingerprint;
|
private TextView mOtrFingerprint;
|
||||||
|
private TextView mAxolotlFingerprint;
|
||||||
|
private TextView mAxolotlDevicelist;
|
||||||
private ImageView mAvatar;
|
private ImageView mAvatar;
|
||||||
private RelativeLayout mOtrFingerprintBox;
|
private RelativeLayout mOtrFingerprintBox;
|
||||||
|
private RelativeLayout mAxolotlFingerprintBox;
|
||||||
|
private RelativeLayout mAxolotlDevicelistBox;
|
||||||
private ImageButton mOtrFingerprintToClipboardButton;
|
private ImageButton mOtrFingerprintToClipboardButton;
|
||||||
|
private ImageButton mAxolotlFingerprintToClipboardButton;
|
||||||
|
private ImageButton mWipeAxolotlPepButton;
|
||||||
|
private ImageButton mRegenerateAxolotlKeyButton;
|
||||||
|
|
||||||
private Jid jidToEdit;
|
private Jid jidToEdit;
|
||||||
private Account mAccount;
|
private Account mAccount;
|
||||||
|
@ -310,6 +323,13 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
|
||||||
this.mOtrFingerprint = (TextView) findViewById(R.id.otr_fingerprint);
|
this.mOtrFingerprint = (TextView) findViewById(R.id.otr_fingerprint);
|
||||||
this.mOtrFingerprintBox = (RelativeLayout) findViewById(R.id.otr_fingerprint_box);
|
this.mOtrFingerprintBox = (RelativeLayout) findViewById(R.id.otr_fingerprint_box);
|
||||||
this.mOtrFingerprintToClipboardButton = (ImageButton) findViewById(R.id.action_copy_to_clipboard);
|
this.mOtrFingerprintToClipboardButton = (ImageButton) findViewById(R.id.action_copy_to_clipboard);
|
||||||
|
this.mAxolotlFingerprint = (TextView) findViewById(R.id.axolotl_fingerprint);
|
||||||
|
this.mAxolotlFingerprintBox = (RelativeLayout) findViewById(R.id.axolotl_fingerprint_box);
|
||||||
|
this.mAxolotlFingerprintToClipboardButton = (ImageButton) findViewById(R.id.action_copy_to_clipboard);
|
||||||
|
this.mRegenerateAxolotlKeyButton = (ImageButton) findViewById(R.id.action_regenerate_axolotl_key);
|
||||||
|
this.mAxolotlDevicelist = (TextView) findViewById(R.id.axolotl_devicelist);
|
||||||
|
this.mAxolotlDevicelistBox = (RelativeLayout) findViewById(R.id.axolotl_devices_box);
|
||||||
|
this.mWipeAxolotlPepButton = (ImageButton) findViewById(R.id.action_wipe_axolotl_pep);
|
||||||
this.mSaveButton = (Button) findViewById(R.id.save_button);
|
this.mSaveButton = (Button) findViewById(R.id.save_button);
|
||||||
this.mCancelButton = (Button) findViewById(R.id.cancel_button);
|
this.mCancelButton = (Button) findViewById(R.id.cancel_button);
|
||||||
this.mSaveButton.setOnClickListener(this.mSaveButtonClickListener);
|
this.mSaveButton.setOnClickListener(this.mSaveButtonClickListener);
|
||||||
|
@ -477,10 +497,10 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
|
||||||
} else {
|
} else {
|
||||||
this.mServerInfoPep.setText(R.string.server_info_unavailable);
|
this.mServerInfoPep.setText(R.string.server_info_unavailable);
|
||||||
}
|
}
|
||||||
final String fingerprint = this.mAccount.getOtrFingerprint();
|
final String otrFingerprint = this.mAccount.getOtrFingerprint();
|
||||||
if (fingerprint != null) {
|
if (otrFingerprint != null) {
|
||||||
this.mOtrFingerprintBox.setVisibility(View.VISIBLE);
|
this.mOtrFingerprintBox.setVisibility(View.VISIBLE);
|
||||||
this.mOtrFingerprint.setText(CryptoHelper.prettifyFingerprint(fingerprint));
|
this.mOtrFingerprint.setText(CryptoHelper.prettifyFingerprint(otrFingerprint));
|
||||||
this.mOtrFingerprintToClipboardButton
|
this.mOtrFingerprintToClipboardButton
|
||||||
.setVisibility(View.VISIBLE);
|
.setVisibility(View.VISIBLE);
|
||||||
this.mOtrFingerprintToClipboardButton
|
this.mOtrFingerprintToClipboardButton
|
||||||
|
@ -489,7 +509,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
|
||||||
@Override
|
@Override
|
||||||
public void onClick(final View v) {
|
public void onClick(final View v) {
|
||||||
|
|
||||||
if (copyTextToClipboard(fingerprint, R.string.otr_fingerprint)) {
|
if (copyTextToClipboard(otrFingerprint, R.string.otr_fingerprint)) {
|
||||||
Toast.makeText(
|
Toast.makeText(
|
||||||
EditAccountActivity.this,
|
EditAccountActivity.this,
|
||||||
R.string.toast_message_otr_fingerprint,
|
R.string.toast_message_otr_fingerprint,
|
||||||
|
@ -500,6 +520,55 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
|
||||||
} else {
|
} else {
|
||||||
this.mOtrFingerprintBox.setVisibility(View.GONE);
|
this.mOtrFingerprintBox.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
final Set<Integer> ownDevices = this.mAccount.getAxolotlService().getOwnDeviceIds();
|
||||||
|
if (ownDevices != null && !ownDevices.isEmpty()) {
|
||||||
|
this.mAxolotlDevicelistBox.setVisibility(View.VISIBLE);
|
||||||
|
this.mAxolotlDevicelist.setText(TextUtils.join(", ", ownDevices));
|
||||||
|
this.mWipeAxolotlPepButton
|
||||||
|
.setVisibility(View.VISIBLE);
|
||||||
|
this.mWipeAxolotlPepButton
|
||||||
|
.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(final View v) {
|
||||||
|
showWipePepDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.mAxolotlDevicelistBox.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
final String axolotlFingerprint = this.mAccount.getAxolotlService().getOwnPublicKey().getFingerprint();
|
||||||
|
if (axolotlFingerprint != null) {
|
||||||
|
this.mAxolotlFingerprintBox.setVisibility(View.VISIBLE);
|
||||||
|
this.mAxolotlFingerprint.setText(CryptoHelper.prettifyFingerprint(axolotlFingerprint));
|
||||||
|
this.mAxolotlFingerprintToClipboardButton
|
||||||
|
.setVisibility(View.VISIBLE);
|
||||||
|
this.mAxolotlFingerprintToClipboardButton
|
||||||
|
.setOnClickListener(new View.OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(final View v) {
|
||||||
|
|
||||||
|
if (copyTextToClipboard(axolotlFingerprint, R.string.axolotl_fingerprint)) {
|
||||||
|
Toast.makeText(
|
||||||
|
EditAccountActivity.this,
|
||||||
|
R.string.toast_message_axolotl_fingerprint,
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.mRegenerateAxolotlKeyButton
|
||||||
|
.setVisibility(View.VISIBLE);
|
||||||
|
this.mRegenerateAxolotlKeyButton
|
||||||
|
.setOnClickListener(new View.OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(final View v) {
|
||||||
|
showRegenerateAxolotlKeyDialog();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.mAxolotlFingerprintBox.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (this.mAccount.errorStatus()) {
|
if (this.mAccount.errorStatus()) {
|
||||||
this.mAccountJid.setError(getString(this.mAccount.getStatus().getReadableId()));
|
this.mAccountJid.setError(getString(this.mAccount.getStatus().getReadableId()));
|
||||||
|
@ -512,4 +581,36 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
|
||||||
this.mStats.setVisibility(View.GONE);
|
this.mStats.setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void showRegenerateAxolotlKeyDialog() {
|
||||||
|
Builder builder = new Builder(this);
|
||||||
|
builder.setTitle("Regenerate Key");
|
||||||
|
builder.setIconAttribute(android.R.attr.alertDialogIcon);
|
||||||
|
builder.setMessage("Are you sure you want to regenerate your Identity Key? (This will also wipe all established sessions and contact Identity Keys)");
|
||||||
|
builder.setNegativeButton(getString(R.string.cancel), null);
|
||||||
|
builder.setPositiveButton("Yes",
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
mAccount.getAxolotlService().regenerateKeys();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showWipePepDialog() {
|
||||||
|
Builder builder = new Builder(this);
|
||||||
|
builder.setTitle("Wipe PEP");
|
||||||
|
builder.setIconAttribute(android.R.attr.alertDialogIcon);
|
||||||
|
builder.setMessage("Are you sure you want to wipe all other devices from the PEP device ID list?");
|
||||||
|
builder.setNegativeButton(getString(R.string.cancel), null);
|
||||||
|
builder.setPositiveButton("Yes",
|
||||||
|
new DialogInterface.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
mAccount.getAxolotlService().wipeOtherPepDevices();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -341,6 +341,107 @@
|
||||||
android:src="?attr/icon_copy"
|
android:src="?attr/icon_copy"
|
||||||
android:visibility="visible"
|
android:visibility="visible"
|
||||||
android:contentDescription="@string/copy_otr_clipboard_description"/>
|
android:contentDescription="@string/copy_otr_clipboard_description"/>
|
||||||
|
</RelativeLayout>
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/axolotl_fingerprint_box"
|
||||||
|
android:layout_marginTop="32dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_toLeftOf="@+id/axolotl_actions"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/axolotl_fingerprint"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/black87"
|
||||||
|
android:textSize="?attr/TextSizeBody"
|
||||||
|
android:typeface="monospace" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/black54"
|
||||||
|
android:textSize="?attr/TextSizeInfo"
|
||||||
|
android:text="@string/axolotl_fingerprint"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/axolotl_actions"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/action_copy_axolotl_to_clipboard"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?android:selectableItemBackground"
|
||||||
|
android:padding="@dimen/image_button_padding"
|
||||||
|
android:src="?attr/icon_copy"
|
||||||
|
android:visibility="visible"
|
||||||
|
android:contentDescription="@string/copy_axolotl_clipboard_description"/>
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/action_regenerate_axolotl_key"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="?android:selectableItemBackground"
|
||||||
|
android:padding="@dimen/image_button_padding"
|
||||||
|
android:src="?attr/icon_refresh"
|
||||||
|
android:visibility="visible"
|
||||||
|
android:contentDescription="@string/regenerate_axolotl_key"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</RelativeLayout>
|
||||||
|
<RelativeLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/axolotl_devices_box"
|
||||||
|
android:layout_marginTop="32dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_toLeftOf="@+id/action_wipe_axolotl_pep"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/axolotl_devicelist"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/black87"
|
||||||
|
android:textSize="?attr/TextSizeBody"
|
||||||
|
android:typeface="monospace" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="@color/black54"
|
||||||
|
android:textSize="?attr/TextSizeInfo"
|
||||||
|
android:text="@string/axolotl_devicelist"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/action_wipe_axolotl_pep"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:background="?android:selectableItemBackground"
|
||||||
|
android:padding="@dimen/image_button_padding"
|
||||||
|
android:src="?attr/icon_remove"
|
||||||
|
android:visibility="visible"
|
||||||
|
android:contentDescription="@string/wipe_axolotl_pep"/>
|
||||||
|
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
|
@ -207,6 +207,8 @@
|
||||||
<string name="reception_failed">Reception failed</string>
|
<string name="reception_failed">Reception failed</string>
|
||||||
<string name="your_fingerprint">Your fingerprint</string>
|
<string name="your_fingerprint">Your fingerprint</string>
|
||||||
<string name="otr_fingerprint">OTR fingerprint</string>
|
<string name="otr_fingerprint">OTR fingerprint</string>
|
||||||
|
<string name="axolotl_fingerprint">Axolotl fingerprint</string>
|
||||||
|
<string name="axolotl_devicelist">Other own Axolotl Devices</string>
|
||||||
<string name="verify">Verify</string>
|
<string name="verify">Verify</string>
|
||||||
<string name="decrypt">Decrypt</string>
|
<string name="decrypt">Decrypt</string>
|
||||||
<string name="conferences">Conferences</string>
|
<string name="conferences">Conferences</string>
|
||||||
|
@ -313,6 +315,7 @@
|
||||||
<string name="pref_conference_name">Conference name</string>
|
<string name="pref_conference_name">Conference name</string>
|
||||||
<string name="pref_conference_name_summary">Use room’s subject instead of JID to identify conferences</string>
|
<string name="pref_conference_name_summary">Use room’s subject instead of JID to identify conferences</string>
|
||||||
<string name="toast_message_otr_fingerprint">OTR fingerprint copied to clipboard!</string>
|
<string name="toast_message_otr_fingerprint">OTR fingerprint copied to clipboard!</string>
|
||||||
|
<string name="toast_message_axolotl_fingerprint">Axolotl fingerprint copied to clipboard!</string>
|
||||||
<string name="conference_banned">You are banned from this conference</string>
|
<string name="conference_banned">You are banned from this conference</string>
|
||||||
<string name="conference_members_only">This conference is members only</string>
|
<string name="conference_members_only">This conference is members only</string>
|
||||||
<string name="conference_kicked">You have been kicked from this conference</string>
|
<string name="conference_kicked">You have been kicked from this conference</string>
|
||||||
|
@ -379,6 +382,9 @@
|
||||||
<string name="reset">Reset</string>
|
<string name="reset">Reset</string>
|
||||||
<string name="account_image_description">Account avatar</string>
|
<string name="account_image_description">Account avatar</string>
|
||||||
<string name="copy_otr_clipboard_description">Copy OTR fingerprint to clipboard</string>
|
<string name="copy_otr_clipboard_description">Copy OTR fingerprint to clipboard</string>
|
||||||
|
<string name="copy_axolotl_clipboard_description">Copy Axolotl fingerprint to clipboard</string>
|
||||||
|
<string name="regenerate_axolotl_key">Copy Axolotl fingerprint to clipboard</string>
|
||||||
|
<string name="wipe_axolotl_pep">Wipe other devices from PEP</string>
|
||||||
<string name="fetching_history_from_server">Fetching history from server</string>
|
<string name="fetching_history_from_server">Fetching history from server</string>
|
||||||
<string name="no_more_history_on_server">No more history on server</string>
|
<string name="no_more_history_on_server">No more history on server</string>
|
||||||
<string name="updating">Updating…</string>
|
<string name="updating">Updating…</string>
|
||||||
|
|
Loading…
Reference in a new issue