From 8dec435e50ace23f7fcc947817fd28f93c2cf66a Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 29 Oct 2019 14:12:05 -0600
Subject: [PATCH 1/6] Bring breadcrumbs into new Riot config standard

---
 .../handlers/AccountSettingsHandler.js        | 44 +++++++++++++++----
 1 file changed, 36 insertions(+), 8 deletions(-)

diff --git a/src/settings/handlers/AccountSettingsHandler.js b/src/settings/handlers/AccountSettingsHandler.js
index 71cef52c4e..1450bed494 100644
--- a/src/settings/handlers/AccountSettingsHandler.js
+++ b/src/settings/handlers/AccountSettingsHandler.js
@@ -19,7 +19,9 @@ import MatrixClientPeg from '../../MatrixClientPeg';
 import MatrixClientBackedSettingsHandler from "./MatrixClientBackedSettingsHandler";
 import {SettingLevel} from "../SettingsStore";
 
-const BREADCRUMBS_EVENT_TYPE = "im.vector.riot.breadcrumb_rooms";
+const BREADCRUMBS_LEGACY_EVENT_TYPE = "im.vector.riot.breadcrumb_rooms";
+const BREADCRUMBS_EVENT_TYPE = "im.vector.setting.breadcrumbs";
+const BREADCRUMBS_EVENT_TYPES = [BREADCRUMBS_LEGACY_EVENT_TYPE, BREADCRUMBS_EVENT_TYPE];
 
 /**
  * Gets and sets settings at the "account" level for the current user.
@@ -57,9 +59,8 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
                 const val = event.getContent()[settingName];
                 this._watchers.notifyUpdate(settingName, null, SettingLevel.ACCOUNT, val);
             }
-        } else if (event.getType() === BREADCRUMBS_EVENT_TYPE) {
-            const val = event.getContent()['rooms'] || [];
-            this._watchers.notifyUpdate("breadcrumb_rooms", null, SettingLevel.ACCOUNT, val);
+        } else if (BREADCRUMBS_EVENT_TYPES.includes(event.getType())) {
+            this._notifyBreadcrumbsUpdate(event);
         }
     }
 
@@ -75,8 +76,15 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
 
         // Special case for breadcrumbs
         if (settingName === "breadcrumb_rooms") {
-            const content = this._getSettings(BREADCRUMBS_EVENT_TYPE) || {};
-            return content['rooms'] || [];
+            let content = this._getSettings(BREADCRUMBS_EVENT_TYPE);
+            if (!content || !content['recent_rooms']) {
+                content = this._getSettings(BREADCRUMBS_LEGACY_EVENT_TYPE);
+
+                // This is a bit of a hack, but it makes things slightly easier
+                if (content) content['recent_rooms'] = content['rooms'];
+            }
+
+            return content && content['recent_rooms'] ? content['recent_rooms'] : [];
         }
 
         const settings = this._getSettings() || {};
@@ -102,8 +110,13 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
 
         // Special case for breadcrumbs
         if (settingName === "breadcrumb_rooms") {
-            const content = this._getSettings(BREADCRUMBS_EVENT_TYPE) || {};
-            content['rooms'] = newValue;
+            // We read the value first just to make sure we preserve whatever random keys might be present.
+            let content = this._getSettings(BREADCRUMBS_EVENT_TYPE);
+            if (!content || !content['recent_rooms']) {
+                content = this._getSettings(BREADCRUMBS_LEGACY_EVENT_TYPE);
+            }
+
+            content['recent_rooms'] = newValue;
             return MatrixClientPeg.get().setAccountData(BREADCRUMBS_EVENT_TYPE, content);
         }
 
@@ -129,4 +142,19 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
         if (!event || !event.getContent()) return null;
         return event.getContent();
     }
+
+    _notifyBreadcrumbsUpdate(event) {
+        let val = [];
+        if (event.getType() === BREADCRUMBS_LEGACY_EVENT_TYPE) {
+            // This seems fishy - try and get the event for the new rooms
+            const newType = this._getSettings(BREADCRUMBS_EVENT_TYPE);
+            if (newType) val = newType['recent_rooms'];
+            else val = event.getContent()['rooms'];
+        } else if (event.getType() === BREADCRUMBS_EVENT_TYPE) {
+            val = event.getContent()['recent_rooms'];
+        } else {
+            return; // for sanity, not because we expect to be here.
+        }
+        this._watchers.notifyUpdate("breadcrumb_rooms", null, SettingLevel.ACCOUNT, val || []);
+    }
 }

From dd8f26a3f68e4ba4a6ae3d7861d3335ad2463c39 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 29 Oct 2019 14:20:53 -0600
Subject: [PATCH 2/6] Add integration manager provisioning setting

To be used later by a future implementation
---
 src/settings/Settings.js                       |  4 ++++
 .../handlers/AccountSettingsHandler.js         | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/settings/Settings.js b/src/settings/Settings.js
index 7470641359..586ec7d1cf 100644
--- a/src/settings/Settings.js
+++ b/src/settings/Settings.js
@@ -279,6 +279,10 @@ export const SETTINGS = {
         supportedLevels: ['account'],
         default: [],
     },
+    "integration_provisioning": {
+        supportedLevels: ['account'],
+        default: true,
+    },
     "analyticsOptIn": {
         supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
         displayName: _td('Send analytics data'),
diff --git a/src/settings/handlers/AccountSettingsHandler.js b/src/settings/handlers/AccountSettingsHandler.js
index 1450bed494..435c8f3388 100644
--- a/src/settings/handlers/AccountSettingsHandler.js
+++ b/src/settings/handlers/AccountSettingsHandler.js
@@ -23,6 +23,8 @@ const BREADCRUMBS_LEGACY_EVENT_TYPE = "im.vector.riot.breadcrumb_rooms";
 const BREADCRUMBS_EVENT_TYPE = "im.vector.setting.breadcrumbs";
 const BREADCRUMBS_EVENT_TYPES = [BREADCRUMBS_LEGACY_EVENT_TYPE, BREADCRUMBS_EVENT_TYPE];
 
+const INTEG_PROVISIONING_EVENT_TYPE = "im.vector.setting.integration_provisioning";
+
 /**
  * Gets and sets settings at the "account" level for the current user.
  * This handler does not make use of the roomId parameter.
@@ -61,6 +63,9 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
             }
         } else if (BREADCRUMBS_EVENT_TYPES.includes(event.getType())) {
             this._notifyBreadcrumbsUpdate(event);
+        } else if (event.getType() === INTEG_PROVISIONING_EVENT_TYPE) {
+            let val = event.getContent()['enabled'];
+            this._watchers.notifyUpdate("integration_provisioning", null, SettingLevel.ACCOUNT, val);
         }
     }
 
@@ -87,6 +92,12 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
             return content && content['recent_rooms'] ? content['recent_rooms'] : [];
         }
 
+        // Special case integration manager provisioning
+        if (settingName === "integration_provisioning") {
+            const content = this._getSettings(INTEG_PROVISIONING_EVENT_TYPE);
+            return content ? content['enabled'] : null;
+        }
+
         const settings = this._getSettings() || {};
         let preferredValue = settings[settingName];
 
@@ -120,6 +131,13 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
             return MatrixClientPeg.get().setAccountData(BREADCRUMBS_EVENT_TYPE, content);
         }
 
+        // Special case integration manager provisioning
+        if (settingName === "integration_provisioning") {
+            const content = this._getSettings(INTEG_PROVISIONING_EVENT_TYPE) || {};
+            content['enabled'] = newValue;
+            return MatrixClientPeg.get().setAccountData(INTEG_PROVISIONING_EVENT_TYPE, content);
+        }
+
         const content = this._getSettings() || {};
         content[settingName] = newValue;
         return MatrixClientPeg.get().setAccountData("im.vector.web.settings", content);

From 3b771f682d1b5dd44358dfbd629b50b936e3d639 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 29 Oct 2019 14:23:59 -0600
Subject: [PATCH 3/6] let -> const

---
 src/settings/handlers/AccountSettingsHandler.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/settings/handlers/AccountSettingsHandler.js b/src/settings/handlers/AccountSettingsHandler.js
index 435c8f3388..7f05dc22c6 100644
--- a/src/settings/handlers/AccountSettingsHandler.js
+++ b/src/settings/handlers/AccountSettingsHandler.js
@@ -64,7 +64,7 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
         } else if (BREADCRUMBS_EVENT_TYPES.includes(event.getType())) {
             this._notifyBreadcrumbsUpdate(event);
         } else if (event.getType() === INTEG_PROVISIONING_EVENT_TYPE) {
-            let val = event.getContent()['enabled'];
+            const val = event.getContent()['enabled'];
             this._watchers.notifyUpdate("integration_provisioning", null, SettingLevel.ACCOUNT, val);
         }
     }

From 28e098832578f291e17bfd9d884880c7373e0fc0 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 29 Oct 2019 14:26:35 -0600
Subject: [PATCH 4/6] Fix naming of integrationProvisioning

---
 src/settings/Settings.js                        | 2 +-
 src/settings/handlers/AccountSettingsHandler.js | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/settings/Settings.js b/src/settings/Settings.js
index 586ec7d1cf..54446a467b 100644
--- a/src/settings/Settings.js
+++ b/src/settings/Settings.js
@@ -279,7 +279,7 @@ export const SETTINGS = {
         supportedLevels: ['account'],
         default: [],
     },
-    "integration_provisioning": {
+    "integrationProvisioning": {
         supportedLevels: ['account'],
         default: true,
     },
diff --git a/src/settings/handlers/AccountSettingsHandler.js b/src/settings/handlers/AccountSettingsHandler.js
index 7f05dc22c6..f738bf7971 100644
--- a/src/settings/handlers/AccountSettingsHandler.js
+++ b/src/settings/handlers/AccountSettingsHandler.js
@@ -65,7 +65,7 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
             this._notifyBreadcrumbsUpdate(event);
         } else if (event.getType() === INTEG_PROVISIONING_EVENT_TYPE) {
             const val = event.getContent()['enabled'];
-            this._watchers.notifyUpdate("integration_provisioning", null, SettingLevel.ACCOUNT, val);
+            this._watchers.notifyUpdate("integrationProvisioning", null, SettingLevel.ACCOUNT, val);
         }
     }
 
@@ -93,7 +93,7 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
         }
 
         // Special case integration manager provisioning
-        if (settingName === "integration_provisioning") {
+        if (settingName === "integrationProvisioning") {
             const content = this._getSettings(INTEG_PROVISIONING_EVENT_TYPE);
             return content ? content['enabled'] : null;
         }
@@ -132,7 +132,7 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa
         }
 
         // Special case integration manager provisioning
-        if (settingName === "integration_provisioning") {
+        if (settingName === "integrationProvisioning") {
             const content = this._getSettings(INTEG_PROVISIONING_EVENT_TYPE) || {};
             content['enabled'] = newValue;
             return MatrixClientPeg.get().setAccountData(INTEG_PROVISIONING_EVENT_TYPE, content);

From 5af6d979c2f3ae13633ea1183a633d7ce0ec033d Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 29 Oct 2019 14:35:35 -0600
Subject: [PATCH 5/6] Support a setting for allowed widgets

Hooking this setting up is left as a problem for a different issue.
---
 src/settings/Settings.js                           |  4 ++++
 .../handlers/RoomAccountSettingsHandler.js         | 14 ++++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/src/settings/Settings.js b/src/settings/Settings.js
index 54446a467b..2220435cb9 100644
--- a/src/settings/Settings.js
+++ b/src/settings/Settings.js
@@ -283,6 +283,10 @@ export const SETTINGS = {
         supportedLevels: ['account'],
         default: true,
     },
+    "allowedWidgets": {
+        supportedLevels: ['room-account'],
+        default: {}, // none allowed
+    },
     "analyticsOptIn": {
         supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG,
         displayName: _td('Send analytics data'),
diff --git a/src/settings/handlers/RoomAccountSettingsHandler.js b/src/settings/handlers/RoomAccountSettingsHandler.js
index 3c8a1f9941..f3a3cb643d 100644
--- a/src/settings/handlers/RoomAccountSettingsHandler.js
+++ b/src/settings/handlers/RoomAccountSettingsHandler.js
@@ -19,6 +19,8 @@ import MatrixClientPeg from '../../MatrixClientPeg';
 import MatrixClientBackedSettingsHandler from "./MatrixClientBackedSettingsHandler";
 import {SettingLevel} from "../SettingsStore";
 
+const ALLOWED_WIDGETS_EVENT_TYPE = "im.vector.setting.allowed_widgets";
+
 /**
  * Gets and sets settings at the "room-account" level for the current user.
  */
@@ -58,6 +60,8 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin
                 const val = event.getContent()[settingName];
                 this._watchers.notifyUpdate(settingName, roomId, SettingLevel.ROOM_ACCOUNT, val);
             }
+        } else if (event.getType() === ALLOWED_WIDGETS_EVENT_TYPE) {
+            this._watchers.notifyUpdate("allowedWidgets", roomId, SettingLevel.ROOM_ACCOUNT, event.getContent());
         }
     }
 
@@ -79,6 +83,11 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin
             return this._getSettings(roomId, "org.matrix.room.color_scheme");
         }
 
+        // Special case allowed widgets
+        if (settingName === "allowedWidgets") {
+            return this._getSettings(roomId, ALLOWED_WIDGETS_EVENT_TYPE);
+        }
+
         const settings = this._getSettings(roomId) || {};
         return settings[settingName];
     }
@@ -97,6 +106,11 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin
             return MatrixClientPeg.get().setRoomAccountData(roomId, "org.matrix.room.color_scheme", newValue);
         }
 
+        // Special case allowed widgets
+        if (settingName === "allowedWidgets") {
+            return return MatrixClientPeg.get().setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, newValue);
+        }
+
         const content = this._getSettings(roomId) || {};
         content[settingName] = newValue;
         return MatrixClientPeg.get().setRoomAccountData(roomId, "im.vector.web.settings", content);

From 9d0d1d3b36bac8448660e37ea105bc85a1b6c278 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Tue, 29 Oct 2019 14:38:39 -0600
Subject: [PATCH 6/6] Our code should probably compile...

---
 src/settings/handlers/RoomAccountSettingsHandler.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/settings/handlers/RoomAccountSettingsHandler.js b/src/settings/handlers/RoomAccountSettingsHandler.js
index f3a3cb643d..0206711db2 100644
--- a/src/settings/handlers/RoomAccountSettingsHandler.js
+++ b/src/settings/handlers/RoomAccountSettingsHandler.js
@@ -108,7 +108,7 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin
 
         // Special case allowed widgets
         if (settingName === "allowedWidgets") {
-            return return MatrixClientPeg.get().setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, newValue);
+            return MatrixClientPeg.get().setRoomAccountData(roomId, ALLOWED_WIDGETS_EVENT_TYPE, newValue);
         }
 
         const content = this._getSettings(roomId) || {};