Tag: permission

  • Android Studio Flatpak light/dark theme automatic change bug fix

    It is nice to have the desktop automatically change its theme from light to dark at sunset. Most applications work by default without further action in Fedora Kinoite. However Android Studio despite supporting light & dark themes for ages did not offer the option to automatically change the theme in Linux until very recently.

    After enabling the “Sync with OS” setting unfortunately nothing happened. Not even a restart of the application changed the theme. Guess Linux is still Linux where everything needs a bit of dedication to properly work.

    So digging into the topic it is (what else!) a Flatpak permissions issue. The dbus communication is not going through between the system and the application. After enabling the permissions I managed to get Android Studio to read the current theme on launch. But this was just a dead end as the automatic switching was still not working, I had to restart Android Studio to pick the switched theme which was not great for the workflow.

    After some time scouting sources of both Android Studio (really IntelliJ IDEA by JetBrains) and the application’s Flathub repo, the culprit was found. Android Studio itself is working fine as on a non-atomic system not using the Flatpak version there is no problem. The issue was in the Flatpak’s environment that missed a specific component, namely dbus-tools. Inside this module the command dbus-monitor is found and this is missing from the current Flathub build.

    The dbus-monitor is used to do exactly as its name states, it monitors the dbus for changes (signals) and this is what Android Studio uses to get the “color-scheme” parameter from the system. If this command cannot be executed it just dies silently and automatic theme change will not work. In a non-atomic system dbus-tools is part of the core system but Flatpaks run in a bare-bones environment and in this case the module is not included.

    To confirm this hypothesis I created my own Flatpak including dbus-tools:

    {
      "name": "dbus-tools",
      "buildsystem": "meson",
      "config-opts": [
        "-Dtools=true",
        "-Dmessage_bus=false",
        "-Dsystemd=disabled",
        "-Dx11_autolaunch=disabled"
      ],
      "sources": [
        {
          "type": "archive",
          "url": "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz",
          "sha256": "0ba2a1a4b16afe7bceb2c07e9ce99a8c2c3508e5dec290dbb643384bd6beb7e2"
        }
      ]
    },
    ...

    There are a few more tweaks that are not relevant for the case in question but are just to get the Flatpak built with less overhead:

    $ cat com.google.AndroidStudio.Test.json 
    {
      "id": "com.google.AndroidStudio.Test",
      "runtime": "org.freedesktop.Sdk",
      "runtime-version": "25.08",
      "sdk": "org.freedesktop.Sdk",
      "command": "android-studio-wrapper",
      "finish-args": [
        "--socket=x11",
        "--socket=pulseaudio",
        "--socket=ssh-auth",
        "--socket=gpg-agent",
        "--share=ipc",
        "--share=network",
        "--device=all",
        "--filesystem=home",
        "--allow=multiarch",
        "--env=JAVA_HOME=/app/extra/jbr",
        "--talk-name=org.freedesktop.Notifications",
        "--talk-name=org.freedesktop.secrets"
      ],
      "modules": [
        {
          "name": "dbus-tools",
          "buildsystem": "meson",
          "config-opts": [
            "-Dtools=true",
            "-Dmessage_bus=false",
    	"-Dsystemd=disabled",
            "-Dx11_autolaunch=disabled"
          ],
          "sources": [
            {
              "type": "archive",
              "url": "https://dbus.freedesktop.org/releases/dbus/dbus-1.16.2.tar.xz",
              "sha256": "0ba2a1a4b16afe7bceb2c07e9ce99a8c2c3508e5dec290dbb643384bd6beb7e2"
            }
          ]
        },
        {
          "name": "android-studio",
          "buildsystem": "simple",
          "build-commands": [
            "install -D -t ${FLATPAK_DEST}/bin/ apply_extra android-studio-wrapper",
            "echo '[Desktop Entry]' > test.desktop",
            "echo 'Type=Application' >> test.desktop",
            "echo 'Name=Android Studio Test' >> test.desktop",
            "echo 'Exec=android-studio-wrapper' >> test.desktop",
            "echo 'Icon=com.google.AndroidStudio.Test' >> test.desktop",
            "echo 'Categories=Development;IDE;' >> test.desktop",
            "install -Dm644 test.desktop ${FLATPAK_DEST}/share/applications/${FLATPAK_ID}.desktop",
            "echo '<?xml version=\"1.0\" encoding=\"UTF-8\"?>' > test.metainfo.xml",
            "echo '<component type=\"desktop-application\">' >> test.metainfo.xml",
            "echo '  <id>com.google.AndroidStudio.Test</id>' >> test.metainfo.xml",
            "echo '  <metadata_license>CC0-1.0</metadata_license>' >> test.metainfo.xml",
            "echo '  <project_license>Apache-2.0</project_license>' >> test.metainfo.xml",
            "echo '  <name>Android Studio Test</name>' >> test.metainfo.xml",
            "echo '  <summary>Test Build</summary>' >> test.metainfo.xml",
            "echo '  <description><p>Testing theme switching configuration.</p></description>' >> test.metainfo.xml",
            "echo '  <launchable type=\"desktop-id\">com.google.AndroidStudio.Test.desktop</launchable>' >> test.metainfo.xml",
            "echo '</component>' >> test.metainfo.xml",
            "install -Dm644 test.metainfo.xml ${FLATPAK_DEST}/share/metainfo/${FLATPAK_ID}.metainfo.xml",
            "echo \"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 10'><rect width='10' height='10' fill='purple'/></svg>\" > test.svg",
            "install -Dm644 test.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/${FLATPAK_ID}.svg"
          ],
          "sources": [
            {
              "type": "extra-data",
              "filename": "android-studio.tar.gz",
              "size": 1541218005,
              "only-arches": [
                "x86_64"
              ],
              "url": "https://dl.google.com/dl/android/studio/ide-zips/2026.1.2.10/android-studio-quail2-linux.tar.gz",
              "sha256": "64445a54092e7056c6eb7f1a89ad116d0feec2ef5f965b8e594d62abdb58590f"
            },
            {
              "type": "script",
              "dest-filename": "apply_extra",
              "commands": [
                "tar xzf android-studio.tar.gz --strip-components=1",
                "rm -f android-studio.tar.gz"
              ]
            },
            {
              "type": "script",
              "dest-filename": "android-studio-wrapper",
              "commands": [
                "/app/extra/bin/studio $@"
              ]
            }
          ]
        }
      ]
    }
    

    Then you install flatpak-builder, build your custom Flatpak and when finalised you can test it out:

    $ sudo dnf -y install flatpak-builder git
    $ flatpak-builder --user --install --force-clean --disable-rofiles-fuse build-dir com.google.AndroidStudio.Test.json
    $ flatpak run --command=dbus-monitor com.google.AndroidStudio.Test
    

    If the last command displays content it means dbus-monitor is now part of your Flatpak’s environment and you can safely launch the full appplication:

    $ flatpak run com.google.AndroidStudio.Test

    I ran all inside a toolbx so that I can get rid of it again easily. Also it should not affect your existing Flathub Android Studio installation, it is a completely parallel Flatpak (com.google.AndroidStudio.Test).

    Now the best moment comes, going into Settings>Appearance and enabling “Sync with OS“. Immediately Android Studio should change its theme to the system one. An easy way to change your theme if you have sunrise & sunset as triggers, is to simply change your location in the KDE Plasma settings e.g. to the other side of the planet, then you can quickly revert back and forth.

    As this is only a personal solution I have also created an issue at the Flathub repo so hopefully we will soon see this Android Studio Flatpak correctly switching light to dark themes and viceversa automatically for everyone.

  • Upload & Insert images as a WordPress contributor

    For my Marbella news site I recently hired an excellent free-lance writer on Elance to assist me in composing quality articles. As the site is also powered by WordPress I added him as a contributor to start of with. He explained he had some trouble adding images per the guide I sent him. The “Upload/Insert” image button was simply not there.

    So to summarise, the WordPress contributor role apparently lacks this permission. There are a few plugins around that can let you tweak those permissions with more granularity, but I just needed that single change.

    A bit of searching revealed exactly what I needed. One minor change in the theme’s functions file was sufficient to upload & insert images as a WordPress contributor:

    if ( current_user_can('contributor') && !current_user_can('upload_files') )
    	add_action('admin_init', 'allow_contributor_uploads');
     
    function allow_contributor_uploads() {
    	$contributor = get_role('contributor');
    	$contributor->add_cap('upload_files');
    }
    

    This also keeps the core clean for changes which makes upgrading WordPress later on less time consuming.

  • Empty Trash from the terminal

    For some reason I can not recall I went into my Trash bin on Fedora. There was unsurprisingly a lot of trash!

    I decided to empty the Trash bin but it only succeeded partially. I had a DVD directory that did not want to be deleted. Looking closer at the message it was a permissions error. Not sure how though, since if I did not have permissions to delete the directory from the Trash bin, how on Earth could I have moved it into the Trash bin to start with…!

    Looking around my home directory in the terminal I could not locate the exact spot to manually remove the directory. As always Google came to assistance and brought up a nice forum topic about how to empty the Trash bin in Fedora from the terminal.

    The simplest way would be to run the following command as root:

    rm -rf  ~/.local/share/Trash/files/*