This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
5.6 KiB
240 lines
5.6 KiB
/** |
|
* Copyright (c) 2015-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
|
|
#import "RCTSurfaceHostingView.h" |
|
|
|
#import "RCTDefines.h" |
|
#import "RCTSurface.h" |
|
#import "RCTSurfaceDelegate.h" |
|
#import "RCTSurfaceView.h" |
|
#import "RCTUtils.h" |
|
|
|
@interface RCTSurfaceHostingView () |
|
|
|
@property (nonatomic, assign) BOOL isActivityIndicatorViewVisible; |
|
@property (nonatomic, assign) BOOL isSurfaceViewVisible; |
|
|
|
@end |
|
|
|
@implementation RCTSurfaceHostingView { |
|
UIView *_Nullable _activityIndicatorView; |
|
UIView *_Nullable _surfaceView; |
|
RCTSurfaceStage _stage; |
|
} |
|
|
|
RCT_NOT_IMPLEMENTED(- (instancetype)init) |
|
RCT_NOT_IMPLEMENTED(- (instancetype)initWithFrame:(CGRect)frame) |
|
RCT_NOT_IMPLEMENTED(- (nullable instancetype)initWithCoder:(NSCoder *)coder) |
|
|
|
- (instancetype)initWithBridge:(RCTBridge *)bridge |
|
moduleName:(NSString *)moduleName |
|
initialProperties:(NSDictionary *)initialProperties |
|
{ |
|
RCTSurface *surface = [self createSurfaceWithBridge:bridge moduleName:moduleName initialProperties:initialProperties]; |
|
return [self initWithSurface:surface]; |
|
|
|
} |
|
|
|
- (instancetype)initWithSurface:(RCTSurface *)surface |
|
{ |
|
if (self = [super initWithFrame:CGRectZero]) { |
|
_surface = surface; |
|
|
|
_sizeMeasureMode = |
|
RCTSurfaceSizeMeasureModeWidthAtMost | |
|
RCTSurfaceSizeMeasureModeHeightAtMost; |
|
|
|
_surface.delegate = self; |
|
_stage = surface.stage; |
|
[self _updateViews]; |
|
} |
|
|
|
return self; |
|
} |
|
|
|
- (RCTSurface *)createSurfaceWithBridge:(RCTBridge *)bridge |
|
moduleName:(NSString *)moduleName |
|
initialProperties:(NSDictionary *)initialProperties |
|
{ |
|
return [[RCTSurface alloc] initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties]; |
|
} |
|
|
|
- (void)setFrame:(CGRect)frame |
|
{ |
|
[super setFrame:frame]; |
|
|
|
CGSize minimumSize; |
|
CGSize maximumSize; |
|
|
|
RCTSurfaceMinimumSizeAndMaximumSizeFromSizeAndSizeMeasureMode( |
|
self.bounds.size, |
|
_sizeMeasureMode, |
|
&minimumSize, |
|
&maximumSize |
|
); |
|
|
|
[_surface setMinimumSize:minimumSize |
|
maximumSize:maximumSize]; |
|
} |
|
|
|
- (CGSize)intrinsicContentSize |
|
{ |
|
if (RCTSurfaceStageIsPreparing(_stage)) { |
|
if (_activityIndicatorView) { |
|
return _activityIndicatorView.intrinsicContentSize; |
|
} |
|
|
|
return CGSizeZero; |
|
} |
|
|
|
return _surface.intrinsicSize; |
|
} |
|
|
|
- (CGSize)sizeThatFits:(CGSize)size |
|
{ |
|
if (RCTSurfaceStageIsPreparing(_stage)) { |
|
if (_activityIndicatorView) { |
|
return [_activityIndicatorView sizeThatFits:size]; |
|
} |
|
|
|
return CGSizeZero; |
|
} |
|
|
|
CGSize minimumSize; |
|
CGSize maximumSize; |
|
|
|
RCTSurfaceMinimumSizeAndMaximumSizeFromSizeAndSizeMeasureMode( |
|
size, |
|
_sizeMeasureMode, |
|
&minimumSize, |
|
&maximumSize |
|
); |
|
|
|
return [_surface sizeThatFitsMinimumSize:minimumSize |
|
maximumSize:maximumSize]; |
|
} |
|
|
|
- (void)setStage:(RCTSurfaceStage)stage |
|
{ |
|
if (stage == _stage) { |
|
return; |
|
} |
|
|
|
BOOL shouldInvalidateLayout = |
|
RCTSurfaceStageIsRunning(stage) != RCTSurfaceStageIsRunning(_stage) || |
|
RCTSurfaceStageIsPreparing(stage) != RCTSurfaceStageIsPreparing(_stage); |
|
|
|
_stage = stage; |
|
|
|
if (shouldInvalidateLayout) { |
|
[self _invalidateLayout]; |
|
[self _updateViews]; |
|
} |
|
} |
|
|
|
- (void)setSizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode |
|
{ |
|
if (sizeMeasureMode == _sizeMeasureMode) { |
|
return; |
|
} |
|
|
|
_sizeMeasureMode = sizeMeasureMode; |
|
[self _invalidateLayout]; |
|
} |
|
|
|
#pragma mark - isActivityIndicatorViewVisible |
|
|
|
- (void)setIsActivityIndicatorViewVisible:(BOOL)visible |
|
{ |
|
if (_isActivityIndicatorViewVisible == visible) { |
|
return; |
|
} |
|
|
|
_isActivityIndicatorViewVisible = visible; |
|
|
|
if (visible) { |
|
if (_activityIndicatorViewFactory) { |
|
_activityIndicatorView = _activityIndicatorViewFactory(); |
|
_activityIndicatorView.frame = self.bounds; |
|
_activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; |
|
[self addSubview:_activityIndicatorView]; |
|
} |
|
} else { |
|
[_activityIndicatorView removeFromSuperview]; |
|
_activityIndicatorView = nil; |
|
} |
|
} |
|
|
|
#pragma mark - isSurfaceViewVisible |
|
|
|
- (void)setIsSurfaceViewVisible:(BOOL)visible |
|
{ |
|
if (_isSurfaceViewVisible == visible) { |
|
return; |
|
} |
|
|
|
_isSurfaceViewVisible = visible; |
|
|
|
if (visible) { |
|
_surfaceView = _surface.view; |
|
_surfaceView.frame = self.bounds; |
|
_surfaceView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; |
|
[self addSubview:_surfaceView]; |
|
} else { |
|
[_surfaceView removeFromSuperview]; |
|
_surfaceView = nil; |
|
} |
|
} |
|
|
|
#pragma mark - activityIndicatorViewFactory |
|
|
|
- (void)setActivityIndicatorViewFactory:(RCTSurfaceHostingViewActivityIndicatorViewFactory)activityIndicatorViewFactory |
|
{ |
|
_activityIndicatorViewFactory = activityIndicatorViewFactory; |
|
if (_isActivityIndicatorViewVisible) { |
|
self.isActivityIndicatorViewVisible = NO; |
|
self.isActivityIndicatorViewVisible = YES; |
|
} |
|
} |
|
|
|
#pragma mark - Private stuff |
|
|
|
- (void)_invalidateLayout |
|
{ |
|
[self invalidateIntrinsicContentSize]; |
|
[self.superview setNeedsLayout]; |
|
} |
|
|
|
- (void)_updateViews |
|
{ |
|
self.isSurfaceViewVisible = RCTSurfaceStageIsRunning(_stage); |
|
self.isActivityIndicatorViewVisible = RCTSurfaceStageIsPreparing(_stage); |
|
} |
|
|
|
- (void)didMoveToWindow |
|
{ |
|
[super didMoveToWindow]; |
|
[self _updateViews]; |
|
} |
|
|
|
#pragma mark - RCTSurfaceDelegate |
|
|
|
- (void)surface:(RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage |
|
{ |
|
RCTExecuteOnMainQueue(^{ |
|
[self setStage:stage]; |
|
}); |
|
} |
|
|
|
- (void)surface:(RCTSurface *)surface didChangeIntrinsicSize:(CGSize)intrinsicSize |
|
{ |
|
RCTExecuteOnMainQueue(^{ |
|
[self _invalidateLayout]; |
|
}); |
|
} |
|
|
|
@end
|
|
|