mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			197 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			197 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			Objective-C
		
	
//
 | 
						|
//  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | 
						|
//
 | 
						|
 | 
						|
#import "OWSMessageTimerView.h"
 | 
						|
#import "OWSMath.h"
 | 
						|
#import "UIColor+OWS.h"
 | 
						|
#import "UIView+OWS.h"
 | 
						|
#import <QuartzCore/QuartzCore.h>
 | 
						|
#import <SignalCoreKit/NSDate+OWS.h>
 | 
						|
#import <SessionUtilitiesKit/NSTimer+Proxying.h>
 | 
						|
 | 
						|
NS_ASSUME_NONNULL_BEGIN
 | 
						|
 | 
						|
const CGFloat kDisappearingMessageIconSize = 12.f;
 | 
						|
 | 
						|
@interface OWSMessageTimerView ()
 | 
						|
 | 
						|
@property (nonatomic) uint32_t initialDurationSeconds;
 | 
						|
@property (nonatomic) uint64_t expirationTimestamp;
 | 
						|
@property (nonatomic) UIColor *tintColor;
 | 
						|
 | 
						|
@property (nonatomic) UIImageView *imageView;
 | 
						|
 | 
						|
@property (nonatomic, nullable) NSTimer *animationTimer;
 | 
						|
 | 
						|
// 0 == about to expire, 12 == just started countdown.
 | 
						|
@property (nonatomic) NSInteger progress12;
 | 
						|
 | 
						|
 | 
						|
@end
 | 
						|
 | 
						|
#pragma mark -
 | 
						|
 | 
						|
@implementation OWSMessageTimerView
 | 
						|
 | 
						|
- (void)dealloc
 | 
						|
{
 | 
						|
    [self clearAnimation];
 | 
						|
}
 | 
						|
 | 
						|
- (instancetype)init
 | 
						|
{
 | 
						|
    self = [super initWithFrame:CGRectZero];
 | 
						|
    if (!self) {
 | 
						|
        return self;
 | 
						|
    }
 | 
						|
 | 
						|
    [self commonInit];
 | 
						|
 | 
						|
    return self;
 | 
						|
}
 | 
						|
 | 
						|
- (void)commonInit
 | 
						|
{
 | 
						|
    self.imageView = [UIImageView new];
 | 
						|
    [self addSubview:self.imageView];
 | 
						|
    [self.imageView ows_autoPinToSuperviewEdges];
 | 
						|
    [self.imageView autoSetDimension:ALDimensionWidth toSize:kDisappearingMessageIconSize];
 | 
						|
    [self.imageView autoSetDimension:ALDimensionHeight toSize:kDisappearingMessageIconSize];
 | 
						|
}
 | 
						|
 | 
						|
- (void)configureWithExpirationTimestamp:(uint64_t)expirationTimestamp
 | 
						|
                  initialDurationSeconds:(uint32_t)initialDurationSeconds
 | 
						|
                               tintColor:(UIColor *)tintColor;
 | 
						|
{
 | 
						|
    self.expirationTimestamp = expirationTimestamp;
 | 
						|
    self.initialDurationSeconds = initialDurationSeconds;
 | 
						|
    self.tintColor = tintColor;
 | 
						|
 | 
						|
    [self updateProgress12];
 | 
						|
    [self updateIcon];
 | 
						|
    [self startAnimation];
 | 
						|
}
 | 
						|
 | 
						|
- (void)updateProgress12
 | 
						|
{
 | 
						|
    BOOL hasStartedCountdown = self.expirationTimestamp > 0;
 | 
						|
    if (!hasStartedCountdown) {
 | 
						|
        self.progress12 = 12;
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    uint64_t nowTimestamp = [NSDate ows_millisecondTimeStamp];
 | 
						|
    CGFloat secondsLeft
 | 
						|
        = (self.expirationTimestamp > nowTimestamp ? (self.expirationTimestamp - nowTimestamp) / 1000.f : 0.f);
 | 
						|
    CGFloat progress = 0.f;
 | 
						|
    if (self.initialDurationSeconds > 0) {
 | 
						|
        progress = CGFloatClamp(secondsLeft / self.initialDurationSeconds, 0.f, 1.f);
 | 
						|
    }
 | 
						|
    OWSAssertDebug(progress >= 0.f);
 | 
						|
    OWSAssertDebug(progress <= 1.f);
 | 
						|
 | 
						|
    self.progress12 = (NSInteger)round(CGFloatClamp(progress, 0.f, 1.f) * 12);
 | 
						|
}
 | 
						|
 | 
						|
- (void)setProgress12:(NSInteger)progress12
 | 
						|
{
 | 
						|
    if (_progress12 == progress12) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    _progress12 = progress12;
 | 
						|
 | 
						|
    [self updateIcon];
 | 
						|
}
 | 
						|
 | 
						|
- (void)updateIcon
 | 
						|
{
 | 
						|
    self.imageView.image = [[self progressIcon] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
 | 
						|
    self.imageView.tintColor = self.tintColor;
 | 
						|
}
 | 
						|
 | 
						|
- (UIImage *)progressIcon
 | 
						|
{
 | 
						|
    OWSAssertDebug(self.progress12 >= 0);
 | 
						|
    OWSAssertDebug(self.progress12 <= 12);
 | 
						|
 | 
						|
    UIImage *_Nullable image;
 | 
						|
    switch (self.progress12) {
 | 
						|
        default:
 | 
						|
        case 0:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_00"];
 | 
						|
            break;
 | 
						|
        case 1:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_05"];
 | 
						|
            break;
 | 
						|
        case 2:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_10"];
 | 
						|
            break;
 | 
						|
        case 3:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_15"];
 | 
						|
            break;
 | 
						|
        case 4:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_20"];
 | 
						|
            break;
 | 
						|
        case 5:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_25"];
 | 
						|
            break;
 | 
						|
        case 6:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_30"];
 | 
						|
            break;
 | 
						|
        case 7:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_35"];
 | 
						|
            break;
 | 
						|
        case 8:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_40"];
 | 
						|
            break;
 | 
						|
        case 9:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_45"];
 | 
						|
            break;
 | 
						|
        case 10:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_50"];
 | 
						|
            break;
 | 
						|
        case 11:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_55"];
 | 
						|
            break;
 | 
						|
        case 12:
 | 
						|
            image = [UIImage imageNamed:@"disappearing_message_60"];
 | 
						|
            break;
 | 
						|
    }
 | 
						|
    OWSAssertDebug(image);
 | 
						|
    OWSAssertDebug(image.size.width == kDisappearingMessageIconSize);
 | 
						|
    OWSAssertDebug(image.size.height == kDisappearingMessageIconSize);
 | 
						|
    return image;
 | 
						|
}
 | 
						|
 | 
						|
- (void)startAnimation
 | 
						|
{
 | 
						|
    [self clearAnimation];
 | 
						|
 | 
						|
    self.animationTimer = [NSTimer weakScheduledTimerWithTimeInterval:0.1f
 | 
						|
                                                               target:self
 | 
						|
                                                             selector:@selector(updateProgress12)
 | 
						|
                                                             userInfo:nil
 | 
						|
                                                              repeats:YES];
 | 
						|
}
 | 
						|
 | 
						|
- (void)clearAnimation
 | 
						|
{
 | 
						|
    [self.animationTimer invalidate];
 | 
						|
    self.animationTimer = nil;
 | 
						|
}
 | 
						|
 | 
						|
- (void)prepareForReuse
 | 
						|
{
 | 
						|
    [self clearAnimation];
 | 
						|
}
 | 
						|
 | 
						|
+ (CGSize)measureSize
 | 
						|
{
 | 
						|
    return CGSizeMake(kDisappearingMessageIconSize, kDisappearingMessageIconSize);
 | 
						|
}
 | 
						|
 | 
						|
@end
 | 
						|
 | 
						|
NS_ASSUME_NONNULL_END
 |