diff --git a/meson.build b/meson.build
index 47f8522ca30fdbe930eeaeb842cdb223ef617de0..a50749bef68f24984bc44ac7107e6cd36bb7151f 100644
--- a/meson.build
+++ b/meson.build
@@ -8,12 +8,15 @@ project(
app_id = 'mobi.phosh.MobileSettings'
+top_inc = include_directories('.')
+
prefix = get_option('prefix')
bindir = prefix / get_option('bindir')
datadir = prefix / get_option('datadir')
libdir = prefix / get_option('libdir')
pkgdatadir = datadir / meson.project_name()
pkglibdir = libdir / meson.project_name()
+libexecdir = join_paths(prefix, get_option('libexecdir'))
ms_plugins_dir = prefix / libdir / 'phosh-mobile-settings' / 'plugins'
glib_ver = '2.76'
diff --git a/src/meson.build b/src/meson.build
index 100b924321cc230c47319ede1cdefc18ee0ea2cd..ea4ba64e880dbbea0527c175cfbd926bf4577311 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,5 +1,6 @@
subdir('dbus')
subdir('pmos-tweaks')
+subdir('search-provider')
mobile_settings_enum_sources = gnome.mkenums_simple(
'ms-enum-types',
diff --git a/src/search-provider/meson.build b/src/search-provider/meson.build
new file mode 100644
index 0000000000000000000000000000000000000000..87c2cf095658326de024905ca1d4f356a286954a
--- /dev/null
+++ b/src/search-provider/meson.build
@@ -0,0 +1,47 @@
+service_conf = configuration_data()
+service_conf.set('libexecdir', libexecdir)
+
+service = 'mobi.phosh.MobileSettings.service'
+
+configure_file(
+ input : service + '.in',
+ output : service,
+ install : true,
+ install_dir : join_paths(datadir, 'dbus-1', 'services'),
+ configuration : service_conf
+)
+
+install_data(
+ 'mobi.phosh.MobileSettings.search-provider.ini',
+ install_dir: join_paths(datadir, 'gnome-shell', 'search-providers')
+)
+
+sources = files(
+ 'ms-search-provider.c',
+ 'ms-search-provider-app.c'
+)
+
+sources += gnome.gdbus_codegen(
+ 'ms-shell-search-provider-generated',
+ 'mobi.phosh.ShellSearchProvider2.xml',
+ interface_prefix : 'mobi.phosh.',
+ namespace : 'Ms'
+)
+
+search_provider_deps = [
+ gio_dep,
+ gio_unix_dep,
+ glib_dep,
+ gtk_dep,
+ adwaita_dep,
+]
+
+executable(
+ 'phosh-mobile-settings-search-provider',
+ sources,
+ include_directories : top_inc,
+ dependencies : search_provider_deps,
+ install : true,
+ install_dir : libexecdir
+)
+
diff --git a/src/search-provider/mobi.phosh.MobileSettings.search-provider.ini b/src/search-provider/mobi.phosh.MobileSettings.search-provider.ini
new file mode 100644
index 0000000000000000000000000000000000000000..37b5685ffcf3beaefe200e6f32b720f6f10aab13
--- /dev/null
+++ b/src/search-provider/mobi.phosh.MobileSettings.search-provider.ini
@@ -0,0 +1,5 @@
+[Shell Search Provider]
+DesktopId=mobi.phosh.MobileSettings.desktop
+BusName=mobi.phosh.MobileSettings.SearchProvider
+ObjectPath=/mobi/phosh/MobileSettings/SearchProvider
+Version=2
diff --git a/src/search-provider/mobi.phosh.MobileSettings.service.in b/src/search-provider/mobi.phosh.MobileSettings.service.in
new file mode 100644
index 0000000000000000000000000000000000000000..df5ad5565335dadbd40f8dacff3df25a7c8db6e8
--- /dev/null
+++ b/src/search-provider/mobi.phosh.MobileSettings.service.in
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=mobi.phosh.MobileSettings.SearchProvider
+Exec=@libexecdir@/phosh-mobile-settings-search-provider
diff --git a/src/search-provider/mobi.phosh.ShellSearchProvider2.xml b/src/search-provider/mobi.phosh.ShellSearchProvider2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9502340e4633e2885c9beaec31248161ee46000b
--- /dev/null
+++ b/src/search-provider/mobi.phosh.ShellSearchProvider2.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/search-provider/ms-search-provider-app.c b/src/search-provider/ms-search-provider-app.c
new file mode 100644
index 0000000000000000000000000000000000000000..262052bb44131fb177bd4ccbd20251631d95fafb
--- /dev/null
+++ b/src/search-provider/ms-search-provider-app.c
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2024 Tether Operations Limited
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * Author: Gotam Gorabh
+ */
+
+/*
+ * Inspired by gnome-control-center search provider:
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.h
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.c
+ *
+ */
+
+#include "mobile-settings-config.h"
+
+#include
+#include
+
+#include
+
+#include "ms-search-provider.h"
+#include "ms-search-provider-app.h"
+
+G_DEFINE_TYPE (MsSearchProviderApp, ms_search_provider_app, GTK_TYPE_APPLICATION);
+
+static gboolean
+ms_search_provider_app_dbus_register (GApplication *application,
+ GDBusConnection *connection,
+ const gchar *object_path,
+ GError **error)
+{
+ MsSearchProviderApp *self;
+
+ if (!G_APPLICATION_CLASS (ms_search_provider_app_parent_class)->dbus_register (application,
+ connection,
+ object_path,
+ error))
+ return FALSE;
+
+ self = MS_SEARCH_PROVIDER_APP (application);
+
+ return ms_search_provider_dbus_register (self->search_provider, connection,
+ object_path, error);
+}
+
+static void
+ms_search_provider_app_dbus_unregister (GApplication *application,
+ GDBusConnection *connection,
+ const gchar *object_path)
+{
+ MsSearchProviderApp *self;
+
+ self = MS_SEARCH_PROVIDER_APP (application);
+ if (self->search_provider)
+ ms_search_provider_dbus_unregister (self->search_provider, connection, object_path);
+
+ G_APPLICATION_CLASS (ms_search_provider_app_parent_class)->dbus_unregister (application,
+ connection,
+ object_path);
+}
+
+static void
+ms_search_provider_app_dispose (GObject *object)
+{
+ MsSearchProviderApp *self;
+
+ self = MS_SEARCH_PROVIDER_APP (object);
+
+ g_clear_object (&self->search_provider);
+
+ G_OBJECT_CLASS (ms_search_provider_app_parent_class)->dispose (object);
+}
+
+static void
+ms_search_provider_app_init (MsSearchProviderApp *self)
+{
+ self->search_provider = ms_search_provider_new ();
+}
+
+static void
+ms_search_provider_app_startup (GApplication *application)
+{
+}
+
+static void
+ms_search_provider_app_class_init (MsSearchProviderAppClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GApplicationClass *app_class = G_APPLICATION_CLASS (klass);
+
+ object_class->dispose = ms_search_provider_app_dispose;
+
+ app_class->dbus_register = ms_search_provider_app_dbus_register;
+ app_class->dbus_unregister = ms_search_provider_app_dbus_unregister;
+ app_class->startup = ms_search_provider_app_startup;
+}
+
+MsSearchProviderApp *
+ms_search_provider_app_get (void)
+{
+ static MsSearchProviderApp *singleton;
+
+ if (singleton)
+ return singleton;
+
+ singleton = g_object_new (MS_TYPE_SEARCH_PROVIDER_APP,
+ "application-id", "mobi.phosh.MobileSettings.SearchProvider",
+ "flags", G_APPLICATION_IS_SERVICE,
+ NULL);
+
+ return singleton;
+}
+
+int main (int argc, char **argv)
+{
+ GApplication *app;
+
+ app = G_APPLICATION (ms_search_provider_app_get ());
+ return g_application_run (app, argc, argv);
+}
diff --git a/src/search-provider/ms-search-provider-app.h b/src/search-provider/ms-search-provider-app.h
new file mode 100644
index 0000000000000000000000000000000000000000..2919a73dcaa3e27db6e0d3735d4c291242dccf62
--- /dev/null
+++ b/src/search-provider/ms-search-provider-app.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2024 Tether Operations Limited
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/*
+ * Inspired by gnome-control-center search provider:
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.h
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/control-center-search-provider.c
+ *
+ */
+
+#pragma once
+
+#include
+
+#include "ms-search-provider.h"
+
+G_BEGIN_DECLS
+
+typedef struct {
+ GtkApplication parent;
+
+ MsSearchProvider *search_provider;
+} MsSearchProviderApp;
+
+typedef struct {
+ GtkApplicationClass parent_class;
+} MsSearchProviderAppClass;
+
+#define MS_TYPE_SEARCH_PROVIDER_APP ms_search_provider_app_get_type ()
+
+#define MS_SEARCH_PROVIDER_APP(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+ MS_TYPE_SEARCH_PROVIDER_APP, MsSearchProviderApp))
+
+GType ms_search_provider_app_get_type (void) G_GNUC_CONST;
+
+MsSearchProviderApp *ms_search_provider_app_get (void);
+
+G_END_DECLS
diff --git a/src/search-provider/ms-search-provider.c b/src/search-provider/ms-search-provider.c
new file mode 100644
index 0000000000000000000000000000000000000000..53fda770fc530a9b2a1bd0c47c42c550e2198934
--- /dev/null
+++ b/src/search-provider/ms-search-provider.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2024 Tether Operations Limited
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ *
+ * Author: Gotam Gorabh
+ */
+
+/*
+ * Inspired by gnome-control-center search provider:
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.h
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.c
+ *
+ */
+
+#include "mobile-settings-config.h"
+
+#include
+#include
+#include
+#include
+#include
+
+#include "ms-search-provider-app.h"
+#include "ms-search-provider.h"
+
+struct _MsSearchProvider
+{
+ GObject parent;
+
+ MsOrgGnomeShellSearchProvider2 *skeleton;
+};
+
+G_DEFINE_TYPE (MsSearchProvider, ms_search_provider, G_TYPE_OBJECT)
+
+static gboolean
+handle_get_initial_result_set (MsSearchProvider *self,
+ GDBusMethodInvocation *invocation,
+ char **terms)
+{
+ return TRUE;
+}
+
+static gboolean
+handle_get_subsearch_result_set (MsSearchProvider *self,
+ GDBusMethodInvocation *invocation,
+ char **previous_results,
+ char **terms)
+{
+ return TRUE;
+}
+
+static gboolean
+handle_get_result_metas (MsSearchProvider *self,
+ GDBusMethodInvocation *invocation,
+ char **results)
+{
+ return TRUE;
+}
+
+static gboolean
+handle_activate_result (MsSearchProvider *self,
+ GDBusMethodInvocation *invocation,
+ char *identifier,
+ char **results,
+ guint timestamp)
+{
+ return TRUE;
+}
+
+static gboolean
+handle_launch_search (MsSearchProvider *self,
+ GDBusMethodInvocation *invocation,
+ char **terms,
+ guint timestamp)
+{
+ return TRUE;
+}
+
+static void
+ms_search_provider_init (MsSearchProvider *self)
+{
+ self->skeleton = ms_org_gnome_shell_search_provider2_skeleton_new ();
+
+ g_signal_connect_swapped (self->skeleton, "handle-get-initial-result-set",
+ G_CALLBACK (handle_get_initial_result_set), self);
+ g_signal_connect_swapped (self->skeleton, "handle-get-subsearch-result-set",
+ G_CALLBACK (handle_get_subsearch_result_set), self);
+ g_signal_connect_swapped (self->skeleton, "handle-get-result-metas",
+ G_CALLBACK (handle_get_result_metas), self);
+ g_signal_connect_swapped (self->skeleton, "handle-activate-result",
+ G_CALLBACK (handle_activate_result), self);
+ g_signal_connect_swapped (self->skeleton, "handle-launch-search",
+ G_CALLBACK (handle_launch_search), self);
+}
+
+gboolean
+ms_search_provider_dbus_register (MsSearchProvider *self,
+ GDBusConnection *connection,
+ const gchar *object_path,
+ GError **error)
+{
+ GDBusInterfaceSkeleton *skeleton;
+
+ skeleton = G_DBUS_INTERFACE_SKELETON (self->skeleton);
+
+ return g_dbus_interface_skeleton_export (skeleton, connection, object_path, error);
+}
+
+void
+ms_search_provider_dbus_unregister (MsSearchProvider *self,
+ GDBusConnection *connection,
+ const gchar *object_path)
+{
+ GDBusInterfaceSkeleton *skeleton;
+
+ skeleton = G_DBUS_INTERFACE_SKELETON (self->skeleton);
+
+ if (g_dbus_interface_skeleton_has_connection (skeleton, connection))
+ g_dbus_interface_skeleton_unexport_from_connection (skeleton, connection);
+}
+
+static void
+ms_search_provider_dispose (GObject *object)
+{
+ MsSearchProvider *self;
+
+ self = MS_SEARCH_PROVIDER (object);
+
+ g_clear_object (&self->skeleton);
+
+ G_OBJECT_CLASS (ms_search_provider_parent_class)->dispose (object);
+}
+
+static void
+ms_search_provider_class_init (MsSearchProviderClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = ms_search_provider_dispose;
+}
+
+MsSearchProvider *
+ms_search_provider_new (void)
+{
+ return g_object_new (MS_TYPE_SEARCH_PROVIDER, NULL);
+}
+
diff --git a/src/search-provider/ms-search-provider.h b/src/search-provider/ms-search-provider.h
new file mode 100644
index 0000000000000000000000000000000000000000..38ed65f9ea68b31f7819881842793064a3906acb
--- /dev/null
+++ b/src/search-provider/ms-search-provider.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2024 Tether Operations Limited
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+/*
+ * Inspired by gnome-control-center search provider:
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.h
+ * https://gitlab.gnome.org/GNOME/gnome-control-center/-/blob/main/search-provider/cc-search-provider.c
+ *
+ */
+
+#pragma once
+
+#include
+#include
+#include "ms-shell-search-provider-generated.h"
+
+G_BEGIN_DECLS
+
+#define MS_TYPE_SEARCH_PROVIDER (ms_search_provider_get_type())
+
+G_DECLARE_FINAL_TYPE (MsSearchProvider, ms_search_provider, MS, SEARCH_PROVIDER, GObject)
+
+MsSearchProvider *ms_search_provider_new (void);
+
+gboolean ms_search_provider_dbus_register (MsSearchProvider *provider,
+ GDBusConnection *connection,
+ const char *object_path,
+ GError **error);
+void ms_search_provider_dbus_unregister (MsSearchProvider *provider,
+ GDBusConnection *connection,
+ const char *object_path);
+
+G_END_DECLS