miniflux/ui/static_manifest.go
Pontus Jensen Karlsson 9fdbd180df Added maskable versions of the PWA icon.
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.
2023-05-08 16:35:37 -07:00

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)
}