name: telegram-desktop
adopt-info: telegram
icon: Telegram/Resources/art/icon512@2x.png

base: core18
grade: stable
confinement: strict

architectures:
  - build-on: amd64
  - build-on: i386
  - build-on: arm64
  - build-on: armhf
  - build-on: ppc64el

apps:
  telegram-desktop:
    command: telegram-launch
    common-id: org.telegram.desktop
    desktop: share/applications/telegramdesktop.desktop
    environment:
      # Use GTK3 cursor theme, icon theme and open/save file dialogs.
      QT_QPA_PLATFORMTHEME: gtk3
    extensions:
      - kde-neon
    plugs:
      - alsa
      - audio-playback
      - audio-record
      - desktop
      - desktop-legacy
      - home
      - network
      - network-manager
      - opengl
      - pulseaudio
      - removable-media
      - unity7
      - wayland
      - x11

plugs:
  # Support for common GTK themes
  # https://forum.snapcraft.io/t/how-to-use-the-system-gtk-theme-via-the-gtk-common-themes-snap/6235
  gsettings:
  gtk-3-themes:
    interface: content
    target: $SNAP/data-dir/themes
    default-provider: gtk-common-themes
  icon-themes:
    interface: content
    target: $SNAP/data-dir/icons
    default-provider: gtk-common-themes
  sound-themes:
    interface: content
    target: $SNAP/data-dir/sounds
    default-provider: gtk-common-themes

layout:
  /usr/share/alsa:
    bind: $SNAP/usr/share/alsa
  /usr/share/X11:
    bind: $SNAP/usr/share/X11

parts:
  telegram:
    plugin: cmake
    source: .
    source-type: git
    parse-info: [share/metainfo/telegramdesktop.appdata.xml]
    build-environment:
      - CFLAGS: "$CFLAGS -I$SNAPCRAFT_STAGE/usr/include/$SNAPCRAFT_ARCH_TRIPLET/qt5/QtWaylandClient/5.12.3"
      - CXXFLAGS: "$CXXFLAGS -I$SNAPCRAFT_STAGE/usr/include/$SNAPCRAFT_ARCH_TRIPLET/qt5/QtWaylandClient/5.12.3"
    build-snaps:
      - kde-frameworks-5-core18-sdk
      - kde-frameworks-5-core18
    build-packages:
      - gcc-8
      - g++-8
      - libasound2-dev
      - libglib2.0-dev
      - libglvnd-dev
      - libgtk-3-dev
      - liblzma-dev
      - libopus-dev
      - libpulse-dev
      - libssl-dev
      - zlib1g-dev
    stage-packages:
      - liblzma5
    configflags:
      - -DCMAKE_C_COMPILER=gcc-8
      - -DCMAKE_CXX_COMPILER=g++-8
      - -DCMAKE_AUTOMOC_MOC_OPTIONS=-I$SNAPCRAFT_STAGE/usr/include/$SNAPCRAFT_ARCH_TRIPLET/qt5/QtWaylandClient/5.12.3
      - -DCMAKE_BUILD_TYPE=Release
      - -DTDESKTOP_API_ID=611335
      - -DTDESKTOP_API_HASH=d524b414d21f4d37f08684c1df41ac9c
      - -DDESKTOP_APP_USE_PACKAGED_LAZY=ON
      - -DDESKTOP_APP_USE_PACKAGED_FONTS=OFF
      - -DTDESKTOP_USE_FONTCONFIG_FALLBACK=ON
    override-pull: |
      snapcraftctl pull

      version_file=Telegram/build/version
      version=$(sed -n "s/AppVersionStr[ ]\+\(.*\)\+/\1/p" $version_file)
      beta=$(sed -n "s/BetaChannel[ ]\+\(.*\)\+/\1/p" $version_file)

      if [ "$beta" != "0" ]; then
        version="$version-beta"
      fi

      version="${version}$(git describe --tags | sed 's,^v[^-]\+,,')"

      snapcraftctl set-version "$version"

      sed -i 's|^Icon=.*|Icon=/share/icons/hicolor/512x512/apps/telegram.png|g' lib/xdg/telegramdesktop.desktop
    after:
      - cmake
      - ffmpeg
      - openal

  telegram-launcher:
    plugin: dump
    source: snap/scripts
    organize:
      telegram-launch: bin/telegram-launch

  patches:
    plugin: dump
    source: Telegram/Patches
    prime: [-./*]

  qtconf:
    plugin: nil
    override-build: |
      KF5_DIR=/snap/kde-frameworks-5-core18-sdk/current

      install -d "$SNAPCRAFT_PART_INSTALL/usr/include/$SNAPCRAFT_ARCH_TRIPLET"
      cp -a $KF5_DIR/usr/include/$SNAPCRAFT_ARCH_TRIPLET/qt5 "$SNAPCRAFT_PART_INSTALL/usr/include/$SNAPCRAFT_ARCH_TRIPLET"

      install -d "$SNAPCRAFT_PART_INSTALL/usr/lib/$SNAPCRAFT_ARCH_TRIPLET"
      cp -a $KF5_DIR/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/qt5 "$SNAPCRAFT_PART_INSTALL/usr/lib/$SNAPCRAFT_ARCH_TRIPLET"

      cat << EOF > "$SNAPCRAFT_PART_INSTALL/qt.conf"
      [Paths]
      Prefix=$KF5_DIR/usr
      ArchData=lib/$SNAPCRAFT_ARCH_TRIPLET/qt5
      Binaries=lib/qt5/bin
      Data=share/qt5
      Documentation=share/qt5/doc
      Examples=lib/$SNAPCRAFT_ARCH_TRIPLET/qt5/examples
      Headers=$SNAPCRAFT_STAGE/usr/include/$SNAPCRAFT_ARCH_TRIPLET/qt5
      HostBinaries=lib/qt5/bin
      HostData=$SNAPCRAFT_STAGE/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/qt5
      HostLibraries=lib/$SNAPCRAFT_ARCH_TRIPLET
      Imports=lib/$SNAPCRAFT_ARCH_TRIPLET/qt5/imports
      Libraries=lib/$SNAPCRAFT_ARCH_TRIPLET
      LibraryExecutables=lib/$SNAPCRAFT_ARCH_TRIPLET/qt5/libexec
      Plugins=lib/$SNAPCRAFT_ARCH_TRIPLET/qt5/plugins
      Qml2Imports=lib/$SNAPCRAFT_ARCH_TRIPLET/qt5/qml
      Settings=/etc/xdg
      Translations=share/qt5/translations
      EOF
    stage:
      - -usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqwayland*
      - -usr/lib/x86_64-linux-gnu/qt5/plugins/wayland*
      - -usr/lib/x86_64-linux-gnu/qt5/qml/QtWayland
    prime: [-./*]

  cmake:
    source: "https://gitlab.kitware.com/cmake/cmake.git"
    source-depth: 1
    source-tag: v3.16.4
    source-type: git
    plugin: make
    override-build: |
      ${SNAPCRAFT_PART_SRC}/bootstrap \
        --parallel=${SNAPCRAFT_PARALLEL_BUILD_COUNT} \
        -- \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_INSTALL_PREFIX=/ \
        -DBUILD_TESTING=OFF
      snapcraftctl build
    build-packages:
      - build-essential
      - libssl-dev
      - libncurses5-dev
    stage-packages:
      - libssl1.1
      - libncurses5
      - libtinfo5
    prime: [-./*]

  nasm:
    source: https://repo.or.cz/nasm.git
    source-depth: 1
    source-tag: nasm-2.14.02
    plugin: autotools
    override-build: |
      ./autogen.sh
      ./configure --prefix=
      make -j$(nproc)
      install -d "$SNAPCRAFT_PART_INSTALL/bin"
      install nasm "$SNAPCRAFT_PART_INSTALL/bin/nasm"
      install ndisasm "$SNAPCRAFT_PART_INSTALL/bin/ndisasm"
    prime: [-./*]

  dav1d:
    source: https://github.com/videolan/dav1d.git
    source-depth: 1
    source-tag: 0.6.0
    plugin: meson
    meson-parameters:
      - --prefix=/usr
      - -Denable_tools=false
      - -Denable_tests=false
    prime:
      - -./usr/include
      - -./usr/lib/*/pkgconfig
    after:
      - nasm

  ffmpeg:
    source: https://github.com/FFmpeg/FFmpeg.git
    source-depth: 1
    source-branch: release/4.2
    plugin: autotools
    build-packages:
      - libopus-dev
      - libva-dev
      - libvdpau-dev
    configflags:
      - --prefix=/usr
      - --disable-static
      - --disable-debug
      - --disable-programs
      - --disable-doc
      - --disable-network
      - --disable-autodetect
      - --disable-everything
      - --disable-neon
      - --disable-alsa
      - --disable-iconv
      - --enable-shared
      - --enable-libdav1d
      - --enable-libopus
      - --enable-vaapi
      - --enable-vdpau
      - --enable-protocol=file
      - --enable-hwaccel=h264_vaapi
      - --enable-hwaccel=h264_vdpau
      - --enable-hwaccel=mpeg4_vaapi
      - --enable-hwaccel=mpeg4_vdpau
      - --enable-decoder=aac
      - --enable-decoder=aac_fixed
      - --enable-decoder=aac_latm
      - --enable-decoder=aasc
      - --enable-decoder=alac
      - --enable-decoder=flac
      - --enable-decoder=gif
      - --enable-decoder=h264
      - --enable-decoder=hevc
      - --enable-decoder=libdav1d
      - --enable-decoder=mp1
      - --enable-decoder=mp1float
      - --enable-decoder=mp2
      - --enable-decoder=mp2float
      - --enable-decoder=mp3
      - --enable-decoder=mp3adu
      - --enable-decoder=mp3adufloat
      - --enable-decoder=mp3float
      - --enable-decoder=mp3on4
      - --enable-decoder=mp3on4float
      - --enable-decoder=mpeg4
      - --enable-decoder=msmpeg4v2
      - --enable-decoder=msmpeg4v3
      - --enable-decoder=opus
      - --enable-decoder=pcm_alaw
      - --enable-decoder=pcm_f32be
      - --enable-decoder=pcm_f32le
      - --enable-decoder=pcm_f64be
      - --enable-decoder=pcm_f64le
      - --enable-decoder=pcm_lxf
      - --enable-decoder=pcm_mulaw
      - --enable-decoder=pcm_s16be
      - --enable-decoder=pcm_s16be_planar
      - --enable-decoder=pcm_s16le
      - --enable-decoder=pcm_s16le_planar
      - --enable-decoder=pcm_s24be
      - --enable-decoder=pcm_s24daud
      - --enable-decoder=pcm_s24le
      - --enable-decoder=pcm_s24le_planar
      - --enable-decoder=pcm_s32be
      - --enable-decoder=pcm_s32le
      - --enable-decoder=pcm_s32le_planar
      - --enable-decoder=pcm_s64be
      - --enable-decoder=pcm_s64le
      - --enable-decoder=pcm_s8
      - --enable-decoder=pcm_s8_planar
      - --enable-decoder=pcm_u16be
      - --enable-decoder=pcm_u16le
      - --enable-decoder=pcm_u24be
      - --enable-decoder=pcm_u24le
      - --enable-decoder=pcm_u32be
      - --enable-decoder=pcm_u32le
      - --enable-decoder=pcm_u8
      - --enable-decoder=pcm_zork
      - --enable-decoder=vorbis
      - --enable-decoder=wavpack
      - --enable-decoder=wmalossless
      - --enable-decoder=wmapro
      - --enable-decoder=wmav1
      - --enable-decoder=wmav2
      - --enable-decoder=wmavoice
      - --enable-encoder=libopus
      - --enable-parser=aac
      - --enable-parser=aac_latm
      - --enable-parser=flac
      - --enable-parser=h264
      - --enable-parser=hevc
      - --enable-parser=mpeg4video
      - --enable-parser=mpegaudio
      - --enable-parser=opus
      - --enable-parser=vorbis
      - --enable-demuxer=aac
      - --enable-demuxer=flac
      - --enable-demuxer=gif
      - --enable-demuxer=h264
      - --enable-demuxer=hevc
      - --enable-demuxer=m4v
      - --enable-demuxer=mov
      - --enable-demuxer=mp3
      - --enable-demuxer=ogg
      - --enable-demuxer=wav
      - --enable-muxer=ogg
      - --enable-muxer=opus
    override-pull: |
      snapcraftctl pull
      patch -p1 < "$SNAPCRAFT_STAGE/ffmpeg.diff"
    prime:
      - -./usr/include
      - -./usr/lib/pkgconfig
    after:
      - patches
      - nasm
      - dav1d

  openal:
    source: https://github.com/kcat/openal-soft.git
    source-depth: 1
    source-tag: openal-soft-1.20.1
    plugin: cmake
    build-packages:
      - libasound2-dev
      - libpulse-dev
      - libsndio-dev
      - portaudio19-dev
    configflags:
      - -DCMAKE_BUILD_TYPE=Release
      - -DALSOFT_EXAMPLES=OFF
      - -DALSOFT_TESTS=OFF
      - -DALSOFT_UTILS=OFF
      - -DALSOFT_CONFIG=OFF
    prime:
      - -./include
      - -./lib/cmake
      - -./lib/pkgconfig

  qgnomeplatform:
    source: https://github.com/FedoraQt/QGnomePlatform.git
    source-depth: 1
    source-tag: 0.6.0
    plugin: dump
    build-snaps:
      - kde-frameworks-5-core18-sdk
      - kde-frameworks-5-core18
    build-packages:
      - libglvnd-dev
      - libgtk-3-dev
    stage-packages:
      - libgtk-3-0
      - cinnamon-desktop-data
    override-build: |
      KF5_DIR=/snap/kde-frameworks-5-core18-sdk/current

      $KF5_DIR/usr/lib/qt5/bin/qmake -qtconf "$SNAPCRAFT_STAGE/qt.conf"
      make -j$(nproc)
      make INSTALL_ROOT="$SNAPCRAFT_PART_INSTALL/tmp" install

      cp -a "$SNAPCRAFT_PART_INSTALL/tmp/$KF5_DIR/." "$SNAPCRAFT_PART_INSTALL"
      rm -r "$SNAPCRAFT_PART_INSTALL/tmp"
    after:
      - qtconf
      - qtwayland

  qtimageformats:
    source: https://github.com/qt/qtimageformats.git
    source-depth: 1
    source-tag: v5.12.3
    plugin: dump
    build-snaps:
      - kde-frameworks-5-core18-sdk
      - kde-frameworks-5-core18
    build-packages:
      - libglvnd-dev
    override-build: |
      KF5_DIR=/snap/kde-frameworks-5-core18-sdk/current

      $KF5_DIR/usr/lib/qt5/bin/qmake -qtconf "$SNAPCRAFT_STAGE/qt.conf"
      make -j$(nproc)
      make INSTALL_ROOT="$SNAPCRAFT_PART_INSTALL/tmp" install

      cp -a "$SNAPCRAFT_PART_INSTALL/tmp/$KF5_DIR/." "$SNAPCRAFT_PART_INSTALL"
      rm -r "$SNAPCRAFT_PART_INSTALL/tmp"
    after:
      - qtconf

  qtwayland:
    source: https://github.com/qt/qtwayland.git
    source-depth: 1
    source-tag: v5.12.3
    plugin: dump
    build-snaps:
      - kde-frameworks-5-core18-sdk
      - kde-frameworks-5-core18
    build-packages:
      - libglvnd-dev
    override-build: |
      KF5_DIR=/snap/kde-frameworks-5-core18-sdk/current

      $KF5_DIR/usr/lib/qt5/bin/qmake -qtconf "$SNAPCRAFT_STAGE/qt.conf"
      make -j$(nproc)
      make INSTALL_ROOT="$SNAPCRAFT_PART_INSTALL/tmp" install

      cp -a "$SNAPCRAFT_PART_INSTALL/tmp/$KF5_DIR/." "$SNAPCRAFT_PART_INSTALL"
      cp -a "$SNAPCRAFT_PART_INSTALL/tmp/$SNAPCRAFT_STAGE/." "$SNAPCRAFT_PART_INSTALL"
      rm -r "$SNAPCRAFT_PART_INSTALL/tmp"
    after:
      - qtconf
    prime: [-./*]