Merge branch 'client-feature-device-management' into 'master'
[Client] Implement device management See merge request famedly/famedlysdk!210
This commit is contained in:
commit
189ea6f50a
|
@ -36,6 +36,7 @@ import 'package:famedlysdk/src/utils/open_id_credentials.dart';
|
||||||
import 'package:famedlysdk/src/utils/session_key.dart';
|
import 'package:famedlysdk/src/utils/session_key.dart';
|
||||||
import 'package:famedlysdk/src/utils/to_device_event.dart';
|
import 'package:famedlysdk/src/utils/to_device_event.dart';
|
||||||
import 'package:famedlysdk/src/utils/turn_server_credentials.dart';
|
import 'package:famedlysdk/src/utils/turn_server_credentials.dart';
|
||||||
|
import 'package:famedlysdk/src/utils/user_device.dart';
|
||||||
import 'package:olm/olm.dart' as olm;
|
import 'package:olm/olm.dart' as olm;
|
||||||
import 'package:pedantic/pedantic.dart';
|
import 'package:pedantic/pedantic.dart';
|
||||||
import 'room.dart';
|
import 'room.dart';
|
||||||
|
@ -1745,4 +1746,38 @@ class Client {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets information about all devices for the current user.
|
||||||
|
Future<List<UserDevice>> requestUserDevices() async {
|
||||||
|
final Map<String, dynamic> response =
|
||||||
|
await jsonRequest(type: HTTPType.GET, action: "/client/r0/devices");
|
||||||
|
List<UserDevice> userDevices = [];
|
||||||
|
for (final rawDevice in response["devices"]) {
|
||||||
|
userDevices.add(
|
||||||
|
UserDevice.fromJson(rawDevice, this),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return userDevices;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Gets information about all devices for the current user.
|
||||||
|
Future<UserDevice> requestUserDevice(String deviceId) async {
|
||||||
|
final Map<String, dynamic> response = await jsonRequest(
|
||||||
|
type: HTTPType.GET, action: "/client/r0/devices/$deviceId");
|
||||||
|
return UserDevice.fromJson(response, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deletes the given devices, and invalidates any access token associated with them.
|
||||||
|
Future<void> deleteDevices(List<String> deviceIds,
|
||||||
|
{Map<String, dynamic> auth}) async {
|
||||||
|
await jsonRequest(
|
||||||
|
type: HTTPType.POST,
|
||||||
|
action: "/client/r0/delete_devices",
|
||||||
|
data: {
|
||||||
|
"devices": deviceIds,
|
||||||
|
if (auth != null) "auth": auth,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
54
lib/src/utils/user_device.dart
Normal file
54
lib/src/utils/user_device.dart
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
import '../client.dart';
|
||||||
|
|
||||||
|
/// Registered device for this user.
|
||||||
|
class UserDevice {
|
||||||
|
/// Identifier of this device.
|
||||||
|
final String deviceId;
|
||||||
|
|
||||||
|
/// Display name set by the user for this device. Absent if no name has been set.
|
||||||
|
final String displayName;
|
||||||
|
|
||||||
|
/// The IP address where this device was last seen. (May be a few minutes out of date, for efficiency reasons).
|
||||||
|
final String lastSeenIp;
|
||||||
|
|
||||||
|
/// The time when this devices was last seen. (May be a few minutes out of date, for efficiency reasons).
|
||||||
|
final DateTime lastSeenTs;
|
||||||
|
|
||||||
|
final Client _client;
|
||||||
|
|
||||||
|
/// Updates the metadata on the given device.
|
||||||
|
Future<void> updateMetaData(String newName) async {
|
||||||
|
await _client.jsonRequest(
|
||||||
|
type: HTTPType.PUT,
|
||||||
|
action: "/client/r0/devices/$deviceId",
|
||||||
|
data: {"display_name": newName},
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deletes the given device, and invalidates any access token associated with it.
|
||||||
|
Future<void> deleteDevice(Map<String, dynamic> auth) async {
|
||||||
|
await _client.jsonRequest(
|
||||||
|
type: HTTPType.DELETE,
|
||||||
|
action: "/client/r0/devices/$deviceId",
|
||||||
|
data: auth != null ? {"auth": auth} : null,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
UserDevice(
|
||||||
|
this._client, {
|
||||||
|
this.deviceId,
|
||||||
|
this.displayName,
|
||||||
|
this.lastSeenIp,
|
||||||
|
this.lastSeenTs,
|
||||||
|
});
|
||||||
|
|
||||||
|
UserDevice.fromJson(Map<String, dynamic> json, Client client)
|
||||||
|
: deviceId = json['device_id'],
|
||||||
|
displayName = json['display_name'],
|
||||||
|
lastSeenIp = json['last_seen_ip'],
|
||||||
|
lastSeenTs =
|
||||||
|
DateTime.fromMillisecondsSinceEpoch(json['last_seen_ts'] ?? 0),
|
||||||
|
_client = client;
|
||||||
|
}
|
|
@ -36,6 +36,7 @@ import 'package:famedlysdk/src/sync/user_update.dart';
|
||||||
import 'package:famedlysdk/src/utils/matrix_exception.dart';
|
import 'package:famedlysdk/src/utils/matrix_exception.dart';
|
||||||
import 'package:famedlysdk/src/utils/matrix_file.dart';
|
import 'package:famedlysdk/src/utils/matrix_file.dart';
|
||||||
import 'package:famedlysdk/src/utils/profile.dart';
|
import 'package:famedlysdk/src/utils/profile.dart';
|
||||||
|
import 'package:famedlysdk/src/utils/user_device.dart';
|
||||||
import 'package:olm/olm.dart' as olm;
|
import 'package:olm/olm.dart' as olm;
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
@ -448,6 +449,16 @@ void main() {
|
||||||
expect(resp["room_id"], roomID);
|
expect(resp["room_id"], roomID);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('requestUserDevices', () async {
|
||||||
|
final List<UserDevice> userDevices = await matrix.requestUserDevices();
|
||||||
|
expect(userDevices.length, 1);
|
||||||
|
expect(userDevices.first.deviceId, "QBUAZIFURK");
|
||||||
|
expect(userDevices.first.displayName, "android");
|
||||||
|
expect(userDevices.first.lastSeenIp, "1.2.3.4");
|
||||||
|
expect(
|
||||||
|
userDevices.first.lastSeenTs.millisecondsSinceEpoch, 1474491775024);
|
||||||
|
});
|
||||||
|
|
||||||
test('get archive', () async {
|
test('get archive', () async {
|
||||||
List<Room> archive = await matrix.archive;
|
List<Room> archive = await matrix.archive;
|
||||||
|
|
||||||
|
|
|
@ -548,6 +548,16 @@ class FakeMatrixApi extends MockClient {
|
||||||
|
|
||||||
static final Map<String, Map<String, dynamic>> api = {
|
static final Map<String, Map<String, dynamic>> api = {
|
||||||
"GET": {
|
"GET": {
|
||||||
|
"/client/r0/devices": (var req) => {
|
||||||
|
"devices": [
|
||||||
|
{
|
||||||
|
"device_id": "QBUAZIFURK",
|
||||||
|
"display_name": "android",
|
||||||
|
"last_seen_ip": "1.2.3.4",
|
||||||
|
"last_seen_ts": 1474491775024
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"/client/r0/rooms/1/state/m.room.member/@alice:example.com": (var req) =>
|
"/client/r0/rooms/1/state/m.room.member/@alice:example.com": (var req) =>
|
||||||
{"displayname": "Alice"},
|
{"displayname": "Alice"},
|
||||||
"/client/r0/profile/@getme:example.com": (var req) => {
|
"/client/r0/profile/@getme:example.com": (var req) => {
|
||||||
|
|
Loading…
Reference in a new issue