9fdbd180df
Recent versions of Android allows the user to choose their own homescreen icons shape. This introduces the concept of maskable PWA icons, which without the "purpose" tag and properly padded icons makes the homescreen icon look really boxy and weird. This adds a new version of the icon with more padding in three sizes, as well as the "purpose" attribute in the manifest.json file. The three old icons are retained for compatibility with desktop and iOS.
83 lines
3.1 KiB
Go
83 lines
3.1 KiB
Go
// Copyright 2018 Frédéric Guillot. All rights reserved.
|
|
// Use of this source code is governed by the Apache 2.0
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ui // import "miniflux.app/ui"
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"miniflux.app/http/request"
|
|
"miniflux.app/http/response/json"
|
|
"miniflux.app/http/route"
|
|
"miniflux.app/model"
|
|
)
|
|
|
|
func (h *handler) showWebManifest(w http.ResponseWriter, r *http.Request) {
|
|
type webManifestShareTargetParams struct {
|
|
URL string `json:"url"`
|
|
Text string `json:"text"`
|
|
}
|
|
|
|
type webManifestShareTarget struct {
|
|
Action string `json:"action"`
|
|
Method string `json:"method"`
|
|
Enctype string `json:"enctype"`
|
|
Params webManifestShareTargetParams `json:"params"`
|
|
}
|
|
|
|
type webManifestIcon struct {
|
|
Source string `json:"src"`
|
|
Sizes string `json:"sizes"`
|
|
Type string `json:"type"`
|
|
Purpose string `json:"purpose"`
|
|
}
|
|
|
|
type webManifest struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
ShortName string `json:"short_name"`
|
|
StartURL string `json:"start_url"`
|
|
Icons []webManifestIcon `json:"icons"`
|
|
ShareTarget webManifestShareTarget `json:"share_target"`
|
|
Display string `json:"display"`
|
|
ThemeColor string `json:"theme_color"`
|
|
BackgroundColor string `json:"background_color"`
|
|
}
|
|
|
|
displayMode := "standalone"
|
|
if request.IsAuthenticated(r) {
|
|
user, err := h.store.UserByID(request.UserID(r))
|
|
if err != nil {
|
|
json.ServerError(w, r, err)
|
|
return
|
|
}
|
|
displayMode = user.DisplayMode
|
|
}
|
|
themeColor := model.ThemeColor(request.UserTheme(r), "light")
|
|
manifest := &webManifest{
|
|
Name: "Miniflux",
|
|
ShortName: "Miniflux",
|
|
Description: "Minimalist Feed Reader",
|
|
Display: displayMode,
|
|
StartURL: route.Path(h.router, "login"),
|
|
ThemeColor: themeColor,
|
|
BackgroundColor: themeColor,
|
|
Icons: []webManifestIcon{
|
|
{Source: route.Path(h.router, "appIcon", "filename", "icon-120.png"), Sizes: "120x120", Type: "image/png", Purpose: "any"},
|
|
{Source: route.Path(h.router, "appIcon", "filename", "icon-192.png"), Sizes: "192x192", Type: "image/png", Purpose: "any"},
|
|
{Source: route.Path(h.router, "appIcon", "filename", "icon-512.png"), Sizes: "512x512", Type: "image/png", Purpose: "any"},
|
|
{Source: route.Path(h.router, "appIcon", "filename", "maskable-icon-120.png"), Sizes: "120x120", Type: "image/png", Purpose: "maskable"},
|
|
{Source: route.Path(h.router, "appIcon", "filename", "maskable-icon-192.png"), Sizes: "192x192", Type: "image/png", Purpose: "maskable"},
|
|
{Source: route.Path(h.router, "appIcon", "filename", "maskable-icon-512.png"), Sizes: "512x512", Type: "image/png", Purpose: "maskable"},
|
|
},
|
|
ShareTarget: webManifestShareTarget{
|
|
Action: route.Path(h.router, "bookmarklet"),
|
|
Method: http.MethodGet,
|
|
Enctype: "application/x-www-form-urlencoded",
|
|
Params: webManifestShareTargetParams{URL: "uri", Text: "text"},
|
|
},
|
|
}
|
|
|
|
json.OK(w, r, manifest)
|
|
}
|