Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

First explainer draft for Contacts Share API #844

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions DocumentSubtitle/explainer.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ This document is a starting point for engaging the community and standards bodie

## Introduction



**Installed web apps cannot provide dynamic/controllable contextual information in their title bar**. Contextual information can be the name of an open document, the section of an app or any other information that can be relevant to the running installed PWA. Having this information in the title bar can be useful to identify the open window when selecting among open apps in surfaces like the Alt+Tab action on Windows (and similar actions on macOS and Linux to jump between open apps).

The current behavior is that an installed web application will put the app's name from the manifest and append the page’s inner text from the `<title>` HTML tag in the head of the page. This often can create awkward titles for some web apps. For instance, some social networking apps change the title of the page to the content it is displaying itself, creating a title that is often too long and not good to identify the installed web app window. See the image below as reference:
Expand Down
Binary file added ShareContacts/contactShare.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
91 changes: 91 additions & 0 deletions ShareContacts/explainer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# Share Contacts for Installed Web Apps

Authors: [Diego Gonzalez](https://github.com/diekus)

## Status of this Document
This document is a starting point for engaging the community and standards bodies in developing collaborative solutions fit for standardization. As the solutions to problems described in this document progress along the standards-track, we will retain this document as an archive and use this section to keep the community up-to-date with the most current standards venue and content location of future work and discussions.
* This document status: **Active**
* Expected venue: [W3C Web Incubator Community Group](https://wicg.io/)
* **Current version: this document**

## Introduction

For modern web applications like social networks and instant messaging, contacts are a fundamental part of the app itself. These contacts are specfic to the application, but the platform/OS can benefit from exposing them in different people related surfaces. Contact Sharing for installed web applications allows web apps to surface contacts in relevant UX on the underlying OS. One example can be sharing. Different platforms have different share UX, and some of these UXs include a list of frequent contacts that make sharing content faster with people the user interacts with frequently.
Copy link
Contributor

Choose a reason for hiding this comment

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

It would be great to include some of the thoughts on other non-share ways these contacts will be leveraged to see how well this API design will meet those needs. In particular I'm wondering about how an app should be indicating it supports (or doesn't support) a particular way for this information to be leveraged. (e.g. Should including a telephone number implicitly mean this app supports making phone calls to it? What about supporting making phone calls, but not supporting as a Share target, because you're only a Phone app? etc.)


## Goals

* Allow installed web applications to participate in contacts/people UX across different platforms.

## Non-goals

*

## Use Cases

### Integrating with platform's Share UX

A user decides to share content and opens the Share UX on the platform. They are presented with their frequent contacts on several apps. They can click on a contact to share the content with that contact. Overall, this represents a faster an easier way to share content. This is also behaviour that is present in several desktop and mobile platforms already. It saves the steps of having to open the app and look for the contact you will be sharing with. The following image shows how the share UX shows contacts on Windows and Android. Notice that each contact is associated to a specific application, as represented by a small app-icon on the bottom-right corner of the displayed contact.

![Share UX on multiple platforms](contactShare.png)

## Proposed solution

The proposed solution is a promise-based method that works in scope of an installed web application to share a list of contacts with the underlying platform. This gets the contacts-per-app into the OS. The other part of the feature is akin to Web Share Target, except it is targeted directly at a specific contact.

### Providing Contacts to the platform

`navigator.shareContacts(<contacts>);`

The method receives contacts as a list of JSON objects. Each object must have at least an `id`, `firstName` and `displayPicture`. Optionally, the contact can have a `lastName`, `rank` and a list of `phones` and `emails`.

#### Contact detailed fields

* `id`: unique id for the contact.
* `firstName`: Contact's first name(s).
Copy link
Contributor

Choose a reason for hiding this comment

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

A firstName/lastName split only makes sense in some parts of the world, so typically we try for more generic options. What about starting with only a required 'name' field, and then additional optional variants could be added in the future if needed.

For some context to reference:
The existing Contact web standard, simply has a 'Name' field.
https://w3c.github.io/contact-picker/#contacts-manager

The Android equivalent of this API uses a ShortLabel and LongLabel.
https://developer.android.com/training/sharing/direct-share-targets

The Windows version supports FirstName and LastName, but also supports DisplayName(Override), HonorificNamePrefix/Suffix, MiddleName, Name, Nickname, YomiFamilyName, and YomiGivenName (and a slew of accessors for having the OS smartly select and combine these for you).
https://learn.microsoft.com/en-us/uwp/api/windows.applicationmodel.contacts.contact?view=winrt-26100

* `displayPicture`: url to the display picture of the contact.
Copy link
Contributor

Choose a reason for hiding this comment

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

For versatility (and consistency with the ContactInfo object) what about a Blob instead of a url?

Copy link
Member Author

Choose a reason for hiding this comment

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

Yes, that was a consideration I thought about. I left it as url thinking in having a blob url with the image. I will explicitly call out the blob part in the explainer.

* `lastName`: Contact's last name(s).
* `rank`: integer that defines the rank or precedence that a contact has in the list. This could be used by the platform to display top contacts first.
Copy link
Contributor

Choose a reason for hiding this comment

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

Reading the Windows API I see they expose a 'rank' field much like this, but the Android equivalent takes a simpler approach of requiring the provided list of contacts to be ordered in terms of rank (without there being an explicit rank field). Though it's not called out, I expect the Windows side may also give preference to the first provided contact over the last provided contact (when no rank is specified).

What about starting with the simpler approach of just declaring the Contacts list as ordered by rank, and then in the future if a need for more complex ranking arises (e.g. 2 contacts sharing a rank, or bigger gaps in rank), the API can be expanded to take an optional 'rank'.

* `phones`: list of strings that represent phone numbers.
Copy link
Contributor

Choose a reason for hiding this comment

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

For consistency with the ContactInfo object, what about 'tels'. Or maybe naming these singularly, and simply accepting a list?
'tel'
'email'

* `emails`: list of strings that represent email addresses.

```json
{
"id" : "contact_id_1",
"firstName" : "John",
"lastName" : "Doe",
"displayPicture" : "https://app.com/imgs/usrs/contactPic.jpg",
"rank" : 1,
"phones" : ["(+44)7123456789"],
"emails" : ["[email protected]", "[email protected]"]
}

```

### Registering the Contact as a share target for the installed app

TODO: investigate how this works on the native side
Copy link
Contributor

Choose a reason for hiding this comment

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

Based on the Windows and Android versions, it seems like the appropriate approach would be a new ShareTargetParams member. Potentially contacts as an array of contact IDs?

https://w3c.github.io/web-share-target/#sharetargetparams-and-its-members


## Considered Alternatives

### Extending the Web Share API

The [Web Share API](https://w3c.github.io/web-share/) allows a web site to share content to an arbitrary destination of the user's choice. At first it was considered extending the API to include sharing contacts, but the scope of sharing contacts to the platform's contact repository is inherently a different one from the one Web Share solves. Additionally, this API does not resolve the second part of the feature, regarding how the web app acts when a contact is invoked from the OS surface it appears.

### Extending the Web Share Target API

The [Web Share Target API](https://w3c.github.io/web-share-target/) allows an installed web app to register itself as a Share Target on the platform. The main use case for this feature is related to exposing contacts in the Share UX of the OS. This API does not have an imperative counterpart, and is specififed through the manifest file. Additionally, this does not cover the case of sharing contacts to the platform, only registering a share target.

### Extending the Contact Picker API

The `contacts` interface seems like a correct location for the `share` method, but this interface is already in use by the Contact Picker API to expose the platform's `ContactsManager`. The scope of the feature also is opposite to the one of the Contact Picker API, since this is the web app sharing to the platform and not the platform sharing to a web app. Due to scope and ergonomics, the Contact Picker API is not the right home for the feature.

## Privacy and Security Considerations

* **Contacts are private to the installed app that shared them only:** Contacts shared by installed apps should be private to that app only. Other applications may not see other app's contacts and these should only appear on relevant platform managed UX (such as the Share Sheet present in multiple OSs).
* **Contacts are dependent on the installed app:** If the web application is uninstalled, the contacts must be deleted from the platform.

## Open Questions

* Should we align the content of the contacts with the information provided in the Contact Picker API?

## Acknowledgements