feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(device_info_plus)!: refactor of device_info_plus platform implementation - #1293

Merged
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus
Oct 27, 2022
Merged

feat(device_info_plus)!: refactor of device_info_plus platform implementation#1293
miquelbeltran merged 14 commits into
mainfrom
refactor-device-info-plus

Conversation

@miquelbeltran

@miquelbeltranmiquelbeltran commented Oct 26, 2022

Copy link
Copy Markdown
Member

Description

This PR contains a refactor of the platform implementation of device_info_plus.

The main idea is to make the device_info_plus_platform_interace as generic as possible.

To do that, the DeviceInfoPlatform now contains a single method deviceInfo().

Any platform implementation can implement it, either with a Dart plugin (like Linux, Windows and Web) or through a platform channel like Android, iOS and macOS implementing the getDeviceInfo platform channel method.

The trick is that now BaseDeviceInfo always contains some data, either because it is returned by the platform channel from native code (like iOS, Android and macOS, or is overridden by the Dart implementation (like Linux, Windows and Web).

This change should be transparent to users (the example code wasn't even changed), however, this PR has been marked as breaking change due to the changes in the platform channels.

Finally, the plugin exposes a data method as replacement for the toMap in the BaseDeviceInfo. This data may not be serializable for dart plugins, but at least it will be there.

With this change, devs can now also add new properties to any of the ***DeviceInfo implementations without having to touch the platform interface package at all.

Related Issues

Checklist

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • I titled the PR using Conventional Commits.
  • I did not modify the CHANGELOG.md nor the pubspec.yaml files.
  • All existing and new tests are passing.
  • The analyzer (flutter analyze) does not report any problems on my PR.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change (please indicate that with a ! in the title as explained in Conventional Commits).
  • No, this is not a breaking change.

Comment on lines +12 to +13
AndroidDeviceInfo._({
required Map<String, dynamic> data,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This private constructor and the fromMap method could be refactored further, probably, but I didn't do it yet. At least I marked this constructor as private now, which shouldn't be used outside the plugin.

Comment on lines -119 to -124
/// Serializes [AndroidDeviceInfo] to map.
@Deprecated('[toMap] method will be discontinued')
@override
Map<String, dynamic> toMap() {
return {
'id': id,

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The original toMap disappears and now instead the data returned by the platform channel is returned. Rather than re-creating the map out of the class data, we return the same data the Android code created, which should be 100% serializable.

Comment on lines +142 to +146
@override
// ignore: deprecated_member_use_from_same_package
Map<String, dynamic> get data => toMap();

@Deprecated('Use [data] getter instead')

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With dart plugins, they can implement the BaseDeviceInfo directly but still need to provide the data. At the moment, there's no warranty that the data is serializable, but that's out of scope for this PR.

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 07:38
@miquelbeltran
miquelbeltran marked this pull request as draft October 26, 2022 07:45
@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Sorry, switching back to draft, need to do some fixes

Comment on lines +111 to +112
// allow for extension of the plugin
return _platform.deviceInfo();

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any new platform implementing deviceInfo() can now return a generic BaseDeviceInfo with some data

Comment on lines -54 to -85
Future<AndroidDeviceInfo> androidInfo() {
throw UnimplementedError('androidInfo() has not been implemented.');
}

// Gets the iOS device information.
// ignore: public_member_api_docs
Future<IosDeviceInfo> iosInfo() {
throw UnimplementedError('iosInfo() has not been implemented.');
}

// Gets the Linux device information.
// ignore: public_member_api_docs
Future<LinuxDeviceInfo> linuxInfo() {
throw UnimplementedError('linuxInfo() has not been implemented.');
}

// Gets the web browser information.
// ignore: public_member_api_docs
Future<WebBrowserInfo> webBrowserInfo() {
throw UnimplementedError('webBrowserInfo() has not been implemented.');
}

// Gets the Macos device information.
// ignore: public_member_api_docs
Future<MacOsDeviceInfo> macosInfo() {
throw UnimplementedError('macosInfo() has not been implemented.');
}

// Gets the Windows device information
// ignore: public_member_api_docs
Future<WindowsDeviceInfo>? windowsInfo() {
throw UnimplementedError('windowsInfo() has not been implemented.');

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All platform specific methods are now replaced by a single deviceInfo() making the platform interface generic

Comment on lines +18 to +20
Future<BaseDeviceInfo> deviceInfo() async {
return BaseDeviceInfo(
(await channel.invokeMethod('getDeviceInfo')).cast<String, dynamic>());

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Platform channels should respond to getDeviceInfo now

@miquelbeltran
miquelbeltran marked this pull request as ready for review October 26, 2022 08:18
@vbuberen

Copy link
Copy Markdown
Collaborator

The suggested way seems Ok to me. Like that the platform interface is generic 👍🏻

@miquelbeltran

Copy link
Copy Markdown
MemberAuthor

Thanks for the review! Let's go!

@miquelbeltran
miquelbeltran merged commit e72efb2 into mainOct 27, 2022
@miquelbeltran
miquelbeltran deleted the refactor-device-info-plus branch October 27, 2022 05:52
@miquelbeltranmiquelbeltran added Hacktoberfest Issues taking part in Hacktoberfest hacktoberfest-accepted labels Oct 29, 2022
@github-actionsgithub-actionsBot locked as resolved and limited conversation to collaborators Jan 28, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

HacktoberfestIssues taking part in Hacktoberfesthacktoberfest-accepted

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@miquelbeltran@vbuberen