|
23 | 23 | import android.content.Intent;
|
24 | 24 | import android.content.pm.PackageInfo;
|
25 | 25 | import android.support.annotation.NonNull;
|
| 26 | +import android.support.v7.app.AlertDialog; |
26 | 27 | import android.text.TextUtils;
|
27 | 28 |
|
| 29 | +import org.jetbrains.annotations.NotNull; |
28 | 30 | import org.matrix.androidsdk.HomeServerConnectionConfig;
|
29 | 31 | import org.matrix.androidsdk.MXDataHandler;
|
30 | 32 | import org.matrix.androidsdk.MXSession;
|
31 | 33 | import org.matrix.androidsdk.crypto.IncomingRoomKeyRequest;
|
32 | 34 | import org.matrix.androidsdk.crypto.IncomingRoomKeyRequestCancellation;
|
33 | 35 | import org.matrix.androidsdk.crypto.MXCrypto;
|
| 36 | +import org.matrix.androidsdk.crypto.keysbackup.KeysBackup; |
| 37 | +import org.matrix.androidsdk.crypto.keysbackup.KeysBackupStateManager; |
34 | 38 | import org.matrix.androidsdk.data.Room;
|
35 | 39 | import org.matrix.androidsdk.data.RoomState;
|
36 | 40 | import org.matrix.androidsdk.data.metrics.MetricsListener;
|
|
53 | 57 | import java.util.ArrayList;
|
54 | 58 | import java.util.Arrays;
|
55 | 59 | import java.util.Collection;
|
| 60 | +import java.util.HashMap; |
56 | 61 | import java.util.HashSet;
|
57 | 62 | import java.util.Iterator;
|
58 | 63 | import java.util.List;
|
| 64 | +import java.util.Map; |
59 | 65 | import java.util.Set;
|
60 | 66 |
|
61 | 67 | import im.vector.activity.CommonActivityUtils;
|
| 68 | +import im.vector.activity.KeysBackupManageActivity; |
62 | 69 | import im.vector.activity.SplashActivity;
|
63 | 70 | import im.vector.analytics.MetricsListenerProxy;
|
64 | 71 | import im.vector.push.PushManager;
|
@@ -100,6 +107,8 @@ public class Matrix {
|
100 | 107 | // tell if the client should be logged out
|
101 | 108 | public boolean mHasBeenDisconnected = false;
|
102 | 109 |
|
| 110 | + public Map<String, KeysBackupStateManager.KeysBackupStateListener> keyBackupStateListeners = new HashMap<>(); |
| 111 | + |
103 | 112 | // i.e the event has been read from another client
|
104 | 113 | private static final MXEventListener mLiveEventListener = new MXEventListener() {
|
105 | 114 | boolean mClearCacheRequired = false;
|
@@ -495,6 +504,12 @@ public void onSuccess(Void info) {
|
495 | 504 | mLoginStorage.removeCredentials(session.getHomeServerConfig());
|
496 | 505 |
|
497 | 506 | session.getDataHandler().removeListener(mLiveEventListener);
|
| 507 | + if (keyBackupStateListeners.get(session.getMyUserId()) != null) { |
| 508 | + if (session.getCrypto() != null) { |
| 509 | + session.getCrypto().getKeysBackup().removeListener(keyBackupStateListeners.get(session.getMyUserId())); |
| 510 | + } |
| 511 | + keyBackupStateListeners.remove(session.getMyUserId()); |
| 512 | + } |
498 | 513 |
|
499 | 514 | VectorApp.removeSyncingSession(session);
|
500 | 515 |
|
@@ -530,6 +545,12 @@ public synchronized void clearSession(final Context context,
|
530 | 545 | }
|
531 | 546 |
|
532 | 547 | session.getDataHandler().removeListener(mLiveEventListener);
|
| 548 | + if (keyBackupStateListeners.get(session.getMyUserId()) != null) { |
| 549 | + if (session.getCrypto() != null) { |
| 550 | + session.getCrypto().getKeysBackup().removeListener(keyBackupStateListeners.get(session.getMyUserId())); |
| 551 | + } |
| 552 | + keyBackupStateListeners.remove(session.getMyUserId()); |
| 553 | + } |
533 | 554 |
|
534 | 555 | ApiCallback<Void> callback = new SimpleApiCallback<Void>() {
|
535 | 556 | @Override
|
@@ -719,13 +740,49 @@ public void onRoomKeyRequestCancellation(IncomingRoomKeyRequestCancellation requ
|
719 | 740 | KeyRequestHandler.getSharedInstance().handleKeyRequestCancellation(request);
|
720 | 741 | }
|
721 | 742 | });
|
| 743 | + |
| 744 | + registerKeyBackupStateListener(session); |
722 | 745 | }
|
723 | 746 | }
|
724 | 747 | });
|
725 | 748 |
|
| 749 | + |
726 | 750 | return session;
|
727 | 751 | }
|
728 | 752 |
|
| 753 | + private void registerKeyBackupStateListener(MXSession session) { |
| 754 | + if (session.getCrypto() != null) { |
| 755 | + KeysBackup keysBackup = session.getCrypto().getKeysBackup(); |
| 756 | + final String matrixID = session.getMyUserId(); |
| 757 | + if (keyBackupStateListeners.get(matrixID) == null) { |
| 758 | + KeysBackupStateManager.KeysBackupStateListener keyBackupStateListener = new KeysBackupStateManager.KeysBackupStateListener() { |
| 759 | + @Override |
| 760 | + public void onStateChange(@NotNull KeysBackupStateManager.KeysBackupState newState) { |
| 761 | + if (KeysBackupStateManager.KeysBackupState.WrongBackUpVersion == newState) { |
| 762 | + //We should show the popup |
| 763 | + Activity activity = VectorApp.getCurrentActivity(); |
| 764 | + //This is fake multi session :/ i should be able to have current session... |
| 765 | + if (activity != null) { |
| 766 | + new AlertDialog.Builder(activity) |
| 767 | + .setTitle(R.string.new_recovery_method_popup_title) |
| 768 | + .setMessage(R.string.new_recovery_method_popup_description) |
| 769 | + .setPositiveButton(R.string.open_settings, (dialog, which) -> { |
| 770 | + activity.startActivity(KeysBackupManageActivity.Companion.intent(activity, matrixID)); |
| 771 | + }) |
| 772 | + .setNegativeButton(R.string.new_recovery_method_popup_was_me, null) |
| 773 | + .show(); |
| 774 | + } |
| 775 | + } |
| 776 | + } |
| 777 | + }; |
| 778 | + keyBackupStateListeners.put(matrixID, keyBackupStateListener); |
| 779 | + } |
| 780 | + keysBackup.addListener(keyBackupStateListeners.get(matrixID)); |
| 781 | + } else { |
| 782 | + Log.e(LOG_TAG, "## Failed to register keybackup state listener"); |
| 783 | + } |
| 784 | + } |
| 785 | + |
729 | 786 | /**
|
730 | 787 | * Reload the matrix sessions.
|
731 | 788 | * The session caches are cleared before being reloaded.
|
|
0 commit comments