@@ -63,6 +63,7 @@ @interface SettingsViewController ()
6363 UISwitch *sortMembersSwitch;
6464 UISwitch *displayLeftMembersSwitch;
6565 MXKTableViewCellWithLabelAndSlider* maxCacheSizeCell;
66+ NSUInteger cacheSize;
6667 NSUInteger minimumCacheSize;
6768 UIButton *clearCacheButton;
6869
@@ -151,7 +152,10 @@ - (void)viewWillAppear:(BOOL)animated
151152 }
152153
153154 selectedCountryCode = countryCode = [_settings phonebookCountryCode ];
154-
155+
156+ // Refresh file stores disk usage asynchronously
157+ [self updateMXCacheSize ];
158+
155159 // Update the minimum cache size with the current value
156160 // Dispatch this operation to not freeze the app
157161 dispatch_async (dispatch_get_main_queue (), ^{
@@ -166,6 +170,12 @@ - (void)viewWillAppear:(BOOL)animated
166170
167171 // Refresh table to remove this account
168172 [self .tableView reloadData ];
173+
174+ // Refresh file stores disk usage
175+ // Dispatch this operation to not freeze the app
176+ dispatch_async (dispatch_get_main_queue (), ^{
177+ [self updateMXCacheSize ];
178+ });
169179 }];
170180}
171181
@@ -298,6 +308,7 @@ - (IBAction)onButtonPressed:(id)sender
298308 else if (sender == clearCacheButton)
299309 {
300310 [[AppDelegate theDelegate ] reloadMatrixSessions: YES ];
311+ [self updateMXCacheSize ];
301312 }
302313}
303314
@@ -799,19 +810,50 @@ - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComp
799810// return the MX cache size in bytes
800811- (NSUInteger )MXCacheSize
801812{
802- NSUInteger cacheSize = 0 ;
803-
804- NSArray *mxSessions = self.mxSessions ;
805- for (MXSession *mxSession in mxSessions)
813+ return cacheSize;
814+ }
815+
816+ // Refresh file stores disk usage asynchronously
817+ - (void )updateMXCacheSize
818+ {
819+ [self MXCacheSize: 0 intermediateDiskUsage: 0 block: ^(NSUInteger diskUsage) {
820+
821+ cacheSize = diskUsage;
822+
823+ [self .tableView reloadRowsAtIndexPaths: @[
824+ [NSIndexPath indexPathForRow: SETTINGS_SECTION_ROOMS_SET_CACHE_SIZE_INDEX + afterChromeOffset
825+ inSection: SETTINGS_SECTION_ROOMS_INDEX],
826+ [NSIndexPath indexPathForRow: SETTINGS_SECTION_ROOMS_CLEAR_CACHE_INDEX + afterChromeOffset
827+ inSection: SETTINGS_SECTION_ROOMS_INDEX],
828+ ] withRowAnimation: UITableViewRowAnimationNone];
829+ }];
830+ }
831+
832+ // Recursive method to asynchronously get the disk usage of all file stores of all sessions
833+ - (void )MXCacheSize : (NSUInteger )sessionIndex intermediateDiskUsage : (NSUInteger )intermediateDiskUsage block : (void (^)(NSUInteger diskUsage))block
834+ {
835+ if (sessionIndex == self.mxSessions .count )
806836 {
837+ block (intermediateDiskUsage);
838+ }
839+ else
840+ {
841+ MXSession *mxSession = self.mxSessions [sessionIndex];
842+
807843 if (mxSession.store && [mxSession.store isKindOfClass: [MXFileStore class ]])
808844 {
809845 MXFileStore *fileStore = (MXFileStore*)mxSession.store ;
810- cacheSize += fileStore.diskUsage ;
846+
847+ [fileStore diskUsageWithBlock: ^(NSUInteger diskUsage) {
848+
849+ [self MXCacheSize: (sessionIndex + 1 ) intermediateDiskUsage: (intermediateDiskUsage + diskUsage) block: block];
850+ }];
851+ }
852+ else
853+ {
854+ [self MXCacheSize: (sessionIndex + 1 ) intermediateDiskUsage: intermediateDiskUsage block: block];
811855 }
812856 }
813-
814- return cacheSize;
815857}
816858
817859// return the sum of the caches (MX cache + media cache ...) in bytes
0 commit comments