44import org .cryptomator .integrations .common .DistributionChannel ;
55import org .cryptomator .integrations .common .OperatingSystem ;
66import org .cryptomator .integrations .common .Priority ;
7+ import org .cryptomator .integrations .update .Progress ;
8+ import org .cryptomator .integrations .update .ProgressListener ;
9+ import org .cryptomator .integrations .update .UpdateAvailable ;
10+ import org .cryptomator .integrations .update .UpdateAvailableListener ;
711import org .cryptomator .integrations .update .UpdateFailedException ;
812import org .cryptomator .integrations .update .UpdateService ;
913import org .freedesktop .dbus .FileDescriptor ;
2024import java .util .Collections ;
2125import java .util .List ;
2226import java .util .Map ;
27+ import java .util .concurrent .CopyOnWriteArrayList ;
2328
2429@ Priority (1000 )
2530@ CheckAvailability
@@ -30,6 +35,9 @@ public class FlatpakUpdater implements UpdateService, AutoCloseable {
3035 private static final Logger LOG = LoggerFactory .getLogger (FlatpakUpdater .class );
3136 private static final String APP_NAME = "org.cryptomator.Cryptomator" ;
3237
38+ private final List <UpdateAvailableListener > updateAvailableListeners = new CopyOnWriteArrayList <>();
39+ private final List <ProgressListener > progressListeners = new CopyOnWriteArrayList <>();
40+
3341 private final UpdatePortal portal ;
3442 private Flatpak .UpdateMonitor updateMonitor ;
3543
@@ -104,6 +112,9 @@ private synchronized Flatpak.UpdateMonitor getUpdateMonitor() {
104112 portal .getDBusConnection ().addSigHandler (Flatpak .UpdateMonitor .UpdateAvailable .class , signal -> {
105113 notifyOnUpdateAvailable (signal );
106114 });
115+ portal .getDBusConnection ().addSigHandler (Flatpak .UpdateMonitor .Progress .class , signal -> {
116+ notifyOnUpdateProceeds (signal );
117+ });
107118 } catch (DBusException e ) {
108119 LOG .error (e .toString (), e .getCause ());
109120 }
@@ -114,8 +125,40 @@ private synchronized Flatpak.UpdateMonitor getUpdateMonitor() {
114125 return updateMonitor ;
115126 }
116127
117- public void notifyOnUpdateAvailable (Flatpak .UpdateMonitor .UpdateAvailable signal ) {
118- LOG .info ("Update available to remote-commit {}" , signal .update_info .get ("remote-commit" ).getValue ());
128+ @ Override
129+ public void addUpdateAvailableListener (UpdateAvailableListener listener ) {
130+ updateAvailableListeners .add (listener );
131+ }
132+
133+ @ Override
134+ public void removeUpdateAvailableListener (UpdateAvailableListener listener ) {
135+ updateAvailableListeners .remove (listener );
136+ }
137+
138+ private void notifyOnUpdateAvailable (Flatpak .UpdateMonitor .UpdateAvailable signal ) {
139+ UpdateAvailable updateAvailable = new UpdateAvailable ((String ) signal .update_info .get ("remote-commit" ).getValue ());
140+ for (UpdateAvailableListener listener : updateAvailableListeners ) {
141+ listener .onUpdateAvailable (updateAvailable );
142+ }
143+ }
144+
145+ @ Override
146+ public void addProgressListener (ProgressListener listener ) {
147+ progressListeners .add (listener );
148+ }
149+
150+ @ Override
151+ public void removeProgressListener (ProgressListener listener ) {
152+ progressListeners .remove (listener );
153+ }
154+
155+ private void notifyOnUpdateProceeds (Flatpak .UpdateMonitor .Progress signal ) {
156+ long status = ((UInt32 ) signal .info .get ("status" ).getValue ()).longValue ();
157+ long progress = ((UInt32 ) signal .info .get ("progress" ).getValue ()).longValue ();
158+ Progress p = new Progress (status , progress );
159+ for (ProgressListener listener : progressListeners ) {
160+ listener .onProgress (p );
161+ }
119162 }
120163
121164 private UInt32 spawnApp (List <Byte > cwdPath , List <List <Byte >> argv , Map <UInt32 , FileDescriptor > fds , Map <String , String > envs , UInt32 flags , Map <String , Variant <?>> options ) {
0 commit comments