name: telegram-desktop
version: git
adopt-info: telegram
description: |
  Telegram is a popular messaging protocol with encryption and security as
  its key focus.

  Fast and secure desktop app, perfectly synced with your mobile phone.

grade: stable
confinement: strict

version-script: |
  set -x
  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[^-]\+,,')"

  echo $version

apps:
  telegram-desktop:
    command: telegram-launch
    common-id: org.telegram.desktop
    environment:
      DISABLE_WAYLAND: 1
      WAYLAND_DISPLAY: no-display
      QTCOMPOSE: $SNAP/usr/share/X11/locale
      HOME: "$SNAP_USER_COMMON"
    plugs:
      - desktop
      - desktop-legacy
      - gsettings
      - home
      - network
      - network-bind
      - network-manager
      - pulseaudio
      - removable-media
      - unity7

plugs:
  gtk-3-themes:
    interface: content
    target: $SNAP/usr/share/themes
    default-provider: gtk-common-themes
  icon-themes:
    interface: content
    target: $SNAP/usr/share/icons
    default-provider: gtk-common-themes
  sound-themes:
    interface: content
    target: $SNAP/usr/share/sounds
    default-provider: gtk-common-themes

parts:
  telegram:
    plugin: gyp-cmake
    source: .
    source-type: git
    parse-info: [lib/xdg/telegramdesktop.appdata.xml]
    build-packages:
      - libappindicator-dev
      - libappindicator3-dev
      - libexif-dev
      - libicu-dev
      - liblzma-dev
      - libssl-dev
      - libdee-dev
      - zlib1g-dev
    gyp-file: Telegram/gyp/Telegram.gyp
    build-type: 'Release'
    artifacts: ['Telegram']
    environment:
      - CC: gcc-8
      - CXX: g++-8
    organize:
      Telegram: bin/Telegram
    configflags:
      - -Dapi_id=611335
      - -Dapi_hash=d524b414d21f4d37f08684c1df41ac9c
      - -Dlinux_path_breakpad=$SNAPCRAFT_STAGE
      - -Dlinux_path_range=$SNAPCRAFT_STAGE/range-v3
      - -Dlinux_path_ffmpeg=$SNAPCRAFT_STAGE
      - -Dlinux_path_libexif_lib=$SNAPCRAFT_STAGE
      - -Dlinux_path_openal=$SNAPCRAFT_STAGE
      - -Dlinux_path_opus_include=$SNAPCRAFT_STAGE/include/opus
      - -Dlinux_path_qt=$SNAPCRAFT_STAGE
      - -Dlinux_path_va=$SNAPCRAFT_STAGE
      - -Dlinux_path_vdpau=$SNAPCRAFT_STAGE
      - -Dlinux_path_xkbcommon=$SNAPCRAFT_STAGE
      - -Dlinux_lib_ssl=-lssl
      - -Dlinux_lib_crypto=-lcrypto
      - -Dlinux_lib_icu=-licuuc -licutu -licui18n
      - -Dbuild_defines=TDESKTOP_DISABLE_AUTOUPDATE,
                        TDESKTOP_DISABLE_REGISTER_CUSTOM_SCHEME,
                        TDESKTOP_DISABLE_DESKTOP_FILE_GENERATION
      - --depth=.
    override-build: |
      set -xe
      snapcraftctl build
      part_src=$SNAPCRAFT_PART_INSTALL/../src
      snap_gui=$SNAPCRAFT_STAGE/../snap/gui
      mkdir -vp $snap_gui
      cp -v $part_src/lib/xdg/telegramdesktop.desktop $snap_gui
      cp -v $part_src/Telegram/Resources/art/icon512@2x.png $snap_gui/icon.png
      sed -i "s|^Icon=.*|Icon=\${SNAP}/meta/gui/icon.png|g" $snap_gui/telegramdesktop.desktop
    after:
      - breakpad
      - ffmpeg
      - gyp
      - libva
      - openal
      - qt
      - range-v3
      - gcc8

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

  desktop-integration:
    plugin: nil
    stage-packages:
      - libappindicator3-1
      - libnotify4
      - libpulse0
    after: [desktop-gtk3]
    stage:
      - -./usr/share/fonts/**
      - -./usr/share/themes/**
      - -./usr/share/icons/**
      - -./usr/share/sounds/**

  desktop-gtk3:
    stage:
      - -./usr/share/fonts/**
      - -./usr/share/themes/**
      - -./usr/share/icons/**
      - -./usr/share/sounds/**
    override-build: |
      set -xe
      snapcraftctl build
      export XDG_DATA_DIRS=$SNAPCRAFT_PART_INSTALL/usr/share
      update-mime-database $SNAPCRAFT_PART_INSTALL/usr/share/mime

      for dir in $SNAPCRAFT_PART_INSTALL/usr/share/icons/*/; do
        if [ -f $dir/index.theme ]; then
          gtk-update-icon-cache-3.0 -q $dir
        fi
      done

  libva:
    source: https://github.com/01org/libva.git
    source-depth: 1
    plugin: autotools
    build-packages:
      - libdrm-dev
      - libegl1-mesa-dev
      - libgl1-mesa-dev
      - libx11-dev
      - libxext-dev
      - libxfixes-dev
    configflags:
      - --enable-static
    prime: [-./*]

  libvdpau:
    source: https://gitlab.freedesktop.org/vdpau/libvdpau.git
    source-depth: 1
    source-branch: libvdpau-1.2
    plugin: autotools
    build-packages:
      - libx11-dev
      - x11proto-dri2-dev
      - libxext-dev
    configflags:
      - --enable-static
    prime: [-./*]

  opus:
    source: https://github.com/xiph/opus.git
    source-depth: 1
    source-branch: v1.2.1
    plugin: autotools
    prime: [-./*]

  ffmpeg:
    source: https://github.com/FFmpeg/FFmpeg.git
    source-depth: 1
    source-branch: release/3.4
    plugin: autotools
    build-packages:
      - libass-dev
      - libfreetype6-dev
      - libgpac-dev
      - liblzma-dev
      - libsdl1.2-dev
      - libtheora-dev
      - libtool
      - libvorbis-dev
      - libxcb1-dev
      - libxcb-shm0-dev
      - libxcb-xfixes0-dev
      - pkg-config
      - texi2html
      - yasm
      - zlib1g-dev
    configflags:
      - --prefix=/
      - --disable-debug
      - --disable-programs
      - --disable-doc
      - --disable-everything
      - --enable-gpl
      - --enable-version3
      - --enable-libopus
      - --enable-decoder=aac
      - --enable-decoder=aac_latm
      - --enable-decoder=aasc
      - --enable-decoder=flac
      - --enable-decoder=gif
      - --enable-decoder=h264
      - --enable-decoder=h264_vdpau
      - --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=mpeg4_vdpau
      - --enable-decoder=msmpeg4v2
      - --enable-decoder=msmpeg4v3
      - --enable-decoder=opus
      - --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-hwaccel=h264_vaapi
      - --enable-hwaccel=h264_vdpau
      - --enable-hwaccel=mpeg4_vaapi
      - --enable-hwaccel=mpeg4_vdpau
      - --enable-parser=aac
      - --enable-parser=aac_latm
      - --enable-parser=flac
      - --enable-parser=h264
      - --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=mov
      - --enable-demuxer=mp3
      - --enable-demuxer=ogg
      - --enable-demuxer=wav
      - --enable-muxer=ogg
      - --enable-muxer=opus
    after:
      - libva
      - libvdpau
      - opus
    prime: [-./*]

  openal:
    source: https://github.com/kcat/openal-soft.git
    source-depth: 1
    source-tag: openal-soft-1.19.1
    plugin: cmake
    build-packages:
      - oss4-dev
      - portaudio19-dev
    configflags:
      - -DCMAKE_BUILD_TYPE=Release
      - -DALSOFT_EXAMPLES=OFF
      - -DALSOFT_TESTS=OFF
      - -DALSOFT_UTILS=OFF
      - -DLIBTYPE=STATIC
    after:
      - ffmpeg
    prime: [-./*]

  libxkbcommon:
    source: https://github.com/xkbcommon/libxkbcommon.git
    source-depth: 1
    source-tag: xkbcommon-0.8.4
    plugin: autotools
    build-packages:
      - xutils-dev
      - bison
      - python-xcbgen
    prime: [-./*]

  qt:
    plugin: qtbuilder
    qt-version: 5.12.5
    qt-source-git: https://code.qt.io/qt/qt5.git
    qt-submodules: ['qtbase', 'qtimageformats']
    qt-patches-base-url: https://raw.githubusercontent.com/desktop-app/patches/master
    qt-extra-plugins:
      - platforminputcontexts:
        - https://github.com/telegramdesktop/fcitx.git
        - https://github.com/telegramdesktop/hime.git
        - https://github.com/telegramdesktop/nimf.git
    environment:
      - CC: gcc-8
      - CXX: g++-8
      - QMAKE_CC: gcc-8
      - QMAKE_CXX: g++-8
    build-packages:
      - libasound2-dev
      - libdbusmenu-glib-dev
      - libffi-dev
      - liblzma-dev
      - libpulse-dev
      - libssl-dev
      - libx11-xcb-dev
      - libxcb-xkb-dev
      - libxcb-icccm4-dev
      - libxcb-image0-dev
      - libxcb-keysyms1-dev
      - libxcb-randr0-dev
      - libxcb-render-util0-dev
      - libxcb-sync-dev
      - libxcb-util0-dev
      - libxcb-xfixes0-dev
      - libxcb1-dev
      - libxrender-dev
    configflags:
      - -prefix
      - $SNAPCRAFT_STAGE
      - -release
      - -force-debug-info
      - -opensource
      - -confirm-license
      - -qt-zlib
      - -qt-libpng
      - -qt-libjpeg
      - -qt-harfbuzz
      - -qt-pcre
      - -qt-xcb
      - -no-gtk
      - -no-mirclient
      - -system-freetype
      - -fontconfig
      - -no-opengl
      - -static
      - -dbus-runtime
      - -openssl-linked
      - -nomake
      - examples
      - -nomake
      - tests
    after:
      - libxkbcommon
      - gcc8
    prime: [-./*]

  breakpad:
    plugin: autotools-subsource
    source: https://chromium.googlesource.com/breakpad/breakpad
    source-type: git
    source-commit: bc8fb886
    sub-sources:
      - linux-syscall-support:
          dest: src/third_party/lss
          source: https://chromium.googlesource.com/linux-syscall-support
          source-type: git
          source-commit: a91633d1
    prime: [-./*]

  range-v3:
    source: https://github.com/ericniebler/range-v3.git
    source-depth: 1
    source-tag: 0.9.1
    plugin: nil
    override-build: |
      set -x
      snapcraftctl build
      mkdir $SNAPCRAFT_PART_INSTALL/range-v3
      cp -rv * $SNAPCRAFT_PART_INSTALL/range-v3
    prime: [-./*]

  gyp:
    plugin: patched-python
    source: https://chromium.googlesource.com/external/gyp
    source-type: git
    source-commit: 702ac58e47
    python-version: python2
    patches:
      - Telegram/Patches/gyp.diff
    prime: [-./*]

  # Since this is supposed to be built against ubuntu 16.04, we need to manually
  # install gcc8, and this is a workaround to achieve this.
  # This part can be safely removed when build.snapcraft.io will allow
  # to build against 18.04.
  gcc8:
    plugin: nil
    build-packages:
      - libmpc-dev
      - libcloog-ppl-dev
    override-pull: |
      set -x
      echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" | \
            sudo tee /etc/apt/sources.list.d/ubuntu-toolchain-r.list
      sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 60C317803A41BA51845E371A1E9377A2BA9EF27F
      sudo apt-get update \
        -o Dir::Etc::sourcelist="sources.list.d/ubuntu-toolchain-r.list" \
        -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
      snapcraftctl pull
    override-build: |
      set -x
      snapcraftctl build
      sudo apt install gcc-8 g++-8 -o Debug::pkgProblemResolver=yes --no-install-recommends -y
      sudo apt-mark auto gcc-8 g++-8
      sudo rm -f /etc/apt/sources.list.d/ubuntu-toolchain-r.list
    prime: [-./*]