mirror of
				https://github.com/Gh0stByte/Bkstg-Plus
				synced 2025-11-03 18:56:19 +00:00 
			
		
		
		
	Initial Release
This commit is contained in:
		
							
								
								
									
										436
									
								
								MBProgressHUD.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										436
									
								
								MBProgressHUD.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,436 @@
 | 
				
			|||||||
 | 
					//
 | 
				
			||||||
 | 
					//  MBProgressHUD.h
 | 
				
			||||||
 | 
					//  Version 1.0.0
 | 
				
			||||||
 | 
					//  Created by Matej Bukovinski on 2.4.09.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This code is distributed under the terms and conditions of the MIT license. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copyright © 2009-2016 Matej Bukovinski
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
 | 
					// of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
 | 
					// in the Software without restriction, including without limitation the rights
 | 
				
			||||||
 | 
					// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
				
			||||||
 | 
					// copies of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					// furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// The above copyright notice and this permission notice shall be included in
 | 
				
			||||||
 | 
					// all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
				
			||||||
 | 
					// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
				
			||||||
 | 
					// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
				
			||||||
 | 
					// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
				
			||||||
 | 
					// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 | 
				
			||||||
 | 
					// THE SOFTWARE.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#import <Foundation/Foundation.h>
 | 
				
			||||||
 | 
					#import <UIKit/UIKit.h>
 | 
				
			||||||
 | 
					#import <CoreGraphics/CoreGraphics.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NS_ASSUME_NONNULL_BEGIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@class MBBackgroundView;
 | 
				
			||||||
 | 
					@protocol MBProgressHUDDelegate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern CGFloat const MBProgressMaxOffset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef NS_ENUM(NSInteger, MBProgressHUDMode) {
 | 
				
			||||||
 | 
					    /// UIActivityIndicatorView.
 | 
				
			||||||
 | 
					    MBProgressHUDModeIndeterminate,
 | 
				
			||||||
 | 
					    /// A round, pie-chart like, progress view.
 | 
				
			||||||
 | 
					    MBProgressHUDModeDeterminate,
 | 
				
			||||||
 | 
					    /// Horizontal progress bar.
 | 
				
			||||||
 | 
					    MBProgressHUDModeDeterminateHorizontalBar,
 | 
				
			||||||
 | 
					    /// Ring-shaped progress view.
 | 
				
			||||||
 | 
					    MBProgressHUDModeAnnularDeterminate,
 | 
				
			||||||
 | 
					    /// Shows a custom view.
 | 
				
			||||||
 | 
					    MBProgressHUDModeCustomView,
 | 
				
			||||||
 | 
					    /// Shows only labels.
 | 
				
			||||||
 | 
					    MBProgressHUDModeText
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) {
 | 
				
			||||||
 | 
					    /// Opacity animation
 | 
				
			||||||
 | 
					    MBProgressHUDAnimationFade,
 | 
				
			||||||
 | 
					    /// Opacity + scale animation (zoom in when appearing zoom out when disappearing)
 | 
				
			||||||
 | 
					    MBProgressHUDAnimationZoom,
 | 
				
			||||||
 | 
					    /// Opacity + scale animation (zoom out style)
 | 
				
			||||||
 | 
					    MBProgressHUDAnimationZoomOut,
 | 
				
			||||||
 | 
					    /// Opacity + scale animation (zoom in style)
 | 
				
			||||||
 | 
					    MBProgressHUDAnimationZoomIn
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) {
 | 
				
			||||||
 | 
					    /// Solid color background
 | 
				
			||||||
 | 
					    MBProgressHUDBackgroundStyleSolidColor,
 | 
				
			||||||
 | 
					    /// UIVisualEffectView or UIToolbar.layer background view
 | 
				
			||||||
 | 
					    MBProgressHUDBackgroundStyleBlur
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void (^MBProgressHUDCompletionBlock)();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					 * Displays a simple HUD window containing a progress indicator and two optional labels for short messages.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This is a simple drop-in class for displaying a progress HUD view similar to Apple's private UIProgressHUD class.
 | 
				
			||||||
 | 
					 * The MBProgressHUD window spans over the entire space given to it by the initWithFrame: constructor and catches all
 | 
				
			||||||
 | 
					 * user input on this region, thereby preventing the user operations on components below the view.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @note To still allow touches to pass through the HUD, you can set hud.userInteractionEnabled = NO.
 | 
				
			||||||
 | 
					 * @attention MBProgressHUD is a UI class and should therefore only be accessed on the main thread.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@interface MBProgressHUD : UIView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Creates a new HUD, adds it to provided view and shows it. The counterpart to this method is hideHUDForView:animated:.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @note This method sets removeFromSuperViewOnHide. The HUD will automatically be removed from the view hierarchy when hidden.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param view The view that the HUD will be added to
 | 
				
			||||||
 | 
					 * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use
 | 
				
			||||||
 | 
					 * animations while appearing.
 | 
				
			||||||
 | 
					 * @return A reference to the created HUD.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see hideHUDForView:animated:
 | 
				
			||||||
 | 
					 * @see animationType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					+ (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @name Showing and hiding
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @note This method sets removeFromSuperViewOnHide. The HUD will automatically be removed from the view hierarchy when hidden.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param view The view that is going to be searched for a HUD subview.
 | 
				
			||||||
 | 
					 * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use
 | 
				
			||||||
 | 
					 * animations while disappearing.
 | 
				
			||||||
 | 
					 * @return YES if a HUD was found and removed, NO otherwise.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see showHUDAddedTo:animated:
 | 
				
			||||||
 | 
					 * @see animationType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					+ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Finds the top-most HUD subview and returns it. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param view The view that is going to be searched.
 | 
				
			||||||
 | 
					 * @return A reference to the last HUD subview discovered.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					+ (nullable MBProgressHUD *)HUDForView:(UIView *)view;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A convenience constructor that initializes the HUD with the view's bounds. Calls the designated constructor with
 | 
				
			||||||
 | 
					 * view.bounds as the parameter.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param view The view instance that will provide the bounds for the HUD. Should be the same instance as
 | 
				
			||||||
 | 
					 * the HUD's superview (i.e., the view that the HUD will be added to).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					- (instancetype)initWithView:(UIView *)view;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					 * Displays the HUD. 
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @note You need to make sure that the main thread completes its run loop soon after this method call so that
 | 
				
			||||||
 | 
					 * the user interface can be updated. Call this method when your task is already set up to be executed in a new thread
 | 
				
			||||||
 | 
					 * (e.g., when using something like NSOperation or making an asynchronous call like NSURLRequest).
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use
 | 
				
			||||||
 | 
					 * animations while appearing.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see animationType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					- (void)showAnimated:(BOOL)animated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					 * Hides the HUD. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to
 | 
				
			||||||
 | 
					 * hide the HUD when your task completes.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use
 | 
				
			||||||
 | 
					 * animations while disappearing.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see animationType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					- (void)hideAnimated:(BOOL)animated;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					 * Hides the HUD after a delay. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to
 | 
				
			||||||
 | 
					 * hide the HUD when your task completes.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use
 | 
				
			||||||
 | 
					 * animations while disappearing.
 | 
				
			||||||
 | 
					 * @param delay Delay in seconds until the HUD is hidden.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @see animationType
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					- (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The HUD delegate object. Receives HUD state notifications.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@property (weak, nonatomic, nullable) id<MBProgressHUDDelegate> delegate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Called after the HUD is hiden.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (copy, nullable) MBProgressHUDCompletionBlock completionBlock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Grace period is the time (in seconds) that the invoked method may be run without
 | 
				
			||||||
 | 
					 * showing the HUD. If the task finishes before the grace time runs out, the HUD will
 | 
				
			||||||
 | 
					 * not be shown at all.
 | 
				
			||||||
 | 
					 * This may be used to prevent HUD display for very short tasks.
 | 
				
			||||||
 | 
					 * Defaults to 0 (no grace time).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) NSTimeInterval graceTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The minimum time (in seconds) that the HUD is shown.
 | 
				
			||||||
 | 
					 * This avoids the problem of the HUD being shown and than instantly hidden.
 | 
				
			||||||
 | 
					 * Defaults to 0 (no minimum show time).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) NSTimeInterval minShowTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Removes the HUD from its parent view when hidden.
 | 
				
			||||||
 | 
					 * Defaults to NO.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) BOOL removeFromSuperViewOnHide;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @name Appearance
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					 * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) MBProgressHUDMode mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A color that gets forwarded to all labels and supported indicators. Also sets the tintColor
 | 
				
			||||||
 | 
					 * for custom views on iOS 7+. Set to nil to manage color individually.
 | 
				
			||||||
 | 
					 * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, nullable) UIColor *contentColor UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The animation type that should be used when the HUD is shown and hidden.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The bezel offset relative to the center of the view. You can use MBProgressMaxOffset
 | 
				
			||||||
 | 
					 * and -MBProgressMaxOffset to move the HUD all the way to the screen edge in each direction.
 | 
				
			||||||
 | 
					 * E.g., CGPointMake(0.f, MBProgressMaxOffset) would position the HUD centered on the bottom edge.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGPoint offset UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views).
 | 
				
			||||||
 | 
					 * This also represents the minimum bezel distance to the edge of the HUD view.
 | 
				
			||||||
 | 
					 * Defaults to 20.f
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGFloat margin UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGSize minSize UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Force the HUD dimensions to be equal if possible.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic, getter = isSquare) BOOL square UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * When enabled, the bezel center gets slightly affected by the device accelerometer data.
 | 
				
			||||||
 | 
					 * Has no effect on iOS < 7.0. Defaults to YES.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic, getter=areDefaultMotionEffectsEnabled) BOOL defaultMotionEffectsEnabled UI_APPEARANCE_SELECTOR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @name Progress
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (assign, nonatomic) float progress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @name ProgressObject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The NSProgress object feeding the progress information to the progress indicator.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, nullable) NSProgress *progressObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// @name Views
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The view containing the labels and indicator (or customView).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, readonly) MBBackgroundView *bezelView;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * View covering the entire HUD area, placed behind bezelView.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, readonly) MBBackgroundView *backgroundView;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView.
 | 
				
			||||||
 | 
					 * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixels.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, nullable) UIView *customView;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit
 | 
				
			||||||
 | 
					 * the entire text.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, readonly) UILabel *label;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, readonly) UILabel *detailsLabel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A button that is placed below the labels. Visible only if a target / action is added. 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (strong, nonatomic, readonly) UIButton *button;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@protocol MBProgressHUDDelegate <NSObject>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@optional
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 
 | 
				
			||||||
 | 
					 * Called after the HUD was fully hidden from the screen. 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					- (void)hudWasHidden:(MBProgressHUD *)hud;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A progress view for showing definite progress by filling up a circle (pie chart).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@interface MBRoundProgressView : UIView 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Progress (0.0 to 1.0)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, assign) float progress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Indicator progress color.
 | 
				
			||||||
 | 
					 * Defaults to white [UIColor whiteColor].
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *progressTintColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Indicator background (non-progress) color. 
 | 
				
			||||||
 | 
					 * Only applicable on iOS versions older than iOS 7.
 | 
				
			||||||
 | 
					 * Defaults to translucent white (alpha 0.1).
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *backgroundTintColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Display mode - NO = round or YES = annular. Defaults to round.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, assign, getter = isAnnular) BOOL annular;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A flat bar progress view. 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@interface MBBarProgressView : UIView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Progress (0.0 to 1.0)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, assign) float progress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Bar border line color.
 | 
				
			||||||
 | 
					 * Defaults to white [UIColor whiteColor].
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *lineColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Bar background color.
 | 
				
			||||||
 | 
					 * Defaults to clear [UIColor clearColor];
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *progressRemainingColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Bar progress color.
 | 
				
			||||||
 | 
					 * Defaults to white [UIColor whiteColor].
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *progressColor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface MBBackgroundView : UIView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The background style. 
 | 
				
			||||||
 | 
					 * Defaults to MBProgressHUDBackgroundStyleBlur on iOS 7 or later and MBProgressHUDBackgroundStyleSolidColor otherwise.
 | 
				
			||||||
 | 
					 * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic) MBProgressHUDBackgroundStyle style;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * The background color or the blur tint color.
 | 
				
			||||||
 | 
					 * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface MBProgressHUD (Deprecated)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					+ (NSArray *)allHUDsForView:(UIView *)view __attribute__((deprecated("Store references when using more than one HUD per view.")));
 | 
				
			||||||
 | 
					+ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated __attribute__((deprecated("Store references when using more than one HUD per view.")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (id)initWithWindow:(UIWindow *)window __attribute__((deprecated("Use initWithView: instead.")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (void)show:(BOOL)animated __attribute__((deprecated("Use showAnimated: instead.")));
 | 
				
			||||||
 | 
					- (void)hide:(BOOL)animated __attribute__((deprecated("Use hideAnimated: instead.")));
 | 
				
			||||||
 | 
					- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay __attribute__((deprecated("Use hideAnimated:afterDelay: instead.")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated __attribute__((deprecated("Use GCD directly.")));
 | 
				
			||||||
 | 
					- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block __attribute__((deprecated("Use GCD directly.")));
 | 
				
			||||||
 | 
					- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(nullable MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly.")));
 | 
				
			||||||
 | 
					- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue __attribute__((deprecated("Use GCD directly.")));
 | 
				
			||||||
 | 
					- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue
 | 
				
			||||||
 | 
					     completionBlock:(nullable MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly.")));
 | 
				
			||||||
 | 
					@property (assign) BOOL taskInProgress __attribute__((deprecated("No longer needed.")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead.")));
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("Use label.font instead.")));
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *labelColor __attribute__((deprecated("Use label.textColor instead.")));
 | 
				
			||||||
 | 
					@property (nonatomic, copy) NSString *detailsLabelText __attribute__((deprecated("Use detailsLabel.text instead.")));
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("Use detailsLabel.font instead.")));
 | 
				
			||||||
 | 
					@property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("Use detailsLabel.textColor instead.")));
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGFloat opacity __attribute__((deprecated("Customize bezelView properties instead.")));
 | 
				
			||||||
 | 
					@property (strong, nonatomic) UIColor *color __attribute__((deprecated("Customize the bezelView color instead.")));
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGFloat xOffset __attribute__((deprecated("Set offset.x instead.")));
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGFloat yOffset __attribute__((deprecated("Set offset.y instead.")));
 | 
				
			||||||
 | 
					@property (assign, nonatomic) CGFloat cornerRadius __attribute__((deprecated("Set bezelView.layer.cornerRadius instead.")));
 | 
				
			||||||
 | 
					@property (assign, nonatomic) BOOL dimBackground __attribute__((deprecated("Customize HUD background properties instead.")));
 | 
				
			||||||
 | 
					@property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView. E.g.: [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil].color = [UIColor redColor];")));
 | 
				
			||||||
 | 
					@property (atomic, assign, readonly) CGSize size __attribute__((deprecated("Get the bezelView.frame.size instead.")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NS_ASSUME_NONNULL_END
 | 
				
			||||||
							
								
								
									
										1484
									
								
								MBProgressHUD.m
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1484
									
								
								MBProgressHUD.m
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					export ARCHS=armv7 armv7s arm64
 | 
				
			||||||
 | 
					include $(THEOS)/makefiles/common.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TWEAK_NAME = bkstg
 | 
				
			||||||
 | 
					bkstg_FILES = Tweak.xm MBProgressHUD.m
 | 
				
			||||||
 | 
					bkstg_FRAMEWORKS = UIKit Photos CoreGraphics QuartzCore AssetsLibrary
 | 
				
			||||||
 | 
					bkstg_CFLAGS = -fobjc-arc 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(THEOS_MAKE_PATH)/tweak.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					after-install::
 | 
				
			||||||
 | 
						install.exec "killall -9 Bkstg"
 | 
				
			||||||
							
								
								
									
										350
									
								
								Tweak.xm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										350
									
								
								Tweak.xm
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,350 @@
 | 
				
			|||||||
 | 
					#import <Photos/Photos.h>
 | 
				
			||||||
 | 
					#import <AssetsLibrary/AssetsLibrary.h>
 | 
				
			||||||
 | 
					#import "MBProgressHUD.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLImageView : UIView
 | 
				
			||||||
 | 
					@property (assign, nonatomic) UIImage *originalImage;
 | 
				
			||||||
 | 
					-(UIImage *)image;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLHubPhotoViewController : UIViewController
 | 
				
			||||||
 | 
					@property (assign, nonatomic) FLImageView *imageView;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLVideoContentView : UIView
 | 
				
			||||||
 | 
					@property (assign, nonatomic) NSURL *videoURL;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLBaseContentHolderView : UIView
 | 
				
			||||||
 | 
					@property (assign, nonatomic) FLVideoContentView *videoView; 
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLPostCollectionViewCell : UIView
 | 
				
			||||||
 | 
					@property (assign, nonatomic) FLBaseContentHolderView *postView;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLCollageSinglePhotoView : UIView
 | 
				
			||||||
 | 
					@property (assign, nonatomic) FLImageView* photoView;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLCollageSinglePhotoViewController : UIViewController
 | 
				
			||||||
 | 
					@property (assign, nonatomic) FLCollageSinglePhotoView* photoView;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%hook FLHubPhotoViewController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-(void)viewDidLoad
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
 | 
				
			||||||
 | 
							initWithTarget:self 
 | 
				
			||||||
 | 
							action:@selector(handleLongPress:)];
 | 
				
			||||||
 | 
						longPress.minimumPressDuration = 1.5;
 | 
				
			||||||
 | 
						[self.view addGestureRecognizer:longPress];
 | 
				
			||||||
 | 
						%orig;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%new
 | 
				
			||||||
 | 
					-(void)handleLongPress:(UILongPressGestureRecognizer *)sender
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Cancel button tappped.
 | 
				
			||||||
 | 
							[self dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Save Image" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UIImage *snapshot = self.imageView.originalImage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
 | 
				
			||||||
 | 
								changeRequest.creationDate          = [NSDate date];
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							completionHandler:^(BOOL success, NSError *error) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (success) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"successfully saved");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"error saving to photos: %@", error);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[self dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Present action sheet.
 | 
				
			||||||
 | 
						[self presentViewController:actionSheet animated:YES completion:nil];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@interface FLPhotoDetailViewController : UIViewController
 | 
				
			||||||
 | 
					@property (assign, nonatomic) FLImageView *photoView;
 | 
				
			||||||
 | 
					@end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%hook FLPhotoDetailViewController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-(void)viewDidLoad
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
 | 
				
			||||||
 | 
							initWithTarget:self 
 | 
				
			||||||
 | 
							action:@selector(handleLongPress:)];
 | 
				
			||||||
 | 
						longPress.minimumPressDuration = 1.5;
 | 
				
			||||||
 | 
						[self.view addGestureRecognizer:longPress];
 | 
				
			||||||
 | 
						%orig;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%new
 | 
				
			||||||
 | 
					-(void)handleLongPress:(UILongPressGestureRecognizer *)sender
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Cancel button tappped.
 | 
				
			||||||
 | 
							[self dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Save Image" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UIImage *snapshot = [self.photoView image];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
 | 
				
			||||||
 | 
								changeRequest.creationDate          = [NSDate date];
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							completionHandler:^(BOOL success, NSError *error) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (success) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"successfully saved");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"error saving to photos: %@", error);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[self dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Present action sheet.
 | 
				
			||||||
 | 
						[self presentViewController:actionSheet animated:YES completion:nil];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%hook FLCollageSinglePhotoViewController
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-(void)viewDidLoad
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
 | 
				
			||||||
 | 
							initWithTarget:self 
 | 
				
			||||||
 | 
							action:@selector(handleLongPress:)];
 | 
				
			||||||
 | 
						longPress.minimumPressDuration = 1.5;
 | 
				
			||||||
 | 
						[self.view addGestureRecognizer:longPress];
 | 
				
			||||||
 | 
						%orig;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%new
 | 
				
			||||||
 | 
					-(void)handleLongPress:(UILongPressGestureRecognizer *)sender
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Cancel button tappped.
 | 
				
			||||||
 | 
							[self  dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Save Image" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UIImage *snapshot = self.photoView.photoView.originalImage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
 | 
				
			||||||
 | 
								changeRequest.creationDate          = [NSDate date];
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							completionHandler:^(BOOL success, NSError *error) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (success) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"successfully saved");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"error saving to photos: %@", error);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[self  dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Present action sheet.
 | 
				
			||||||
 | 
						[self  presentViewController:actionSheet animated:YES completion:nil];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IGNORE ABOVE. SAVES IMAGES 
 | 
				
			||||||
 | 
					//FLAVPlayerLayerView
 | 
				
			||||||
 | 
					//FLHubVideoCollection
 | 
				
			||||||
 | 
					//FLVideoContentHolderVIew
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%hook FLPostCollectionViewCell
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-(void)setPostView:(FLBaseContentHolderView *)holderView
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if([holderView respondsToSelector:@selector(videoView)])
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if(holderView.videoView.videoURL)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(downloadVideo:)];
 | 
				
			||||||
 | 
								doubleTap.numberOfTapsRequired = 3; 
 | 
				
			||||||
 | 
								[self addGestureRecognizer:doubleTap];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						%orig;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%new
 | 
				
			||||||
 | 
					-(void)downloadVideo:(UITapGestureRecognizer *)sender
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						[sender setEnabled:NO];
 | 
				
			||||||
 | 
						NSLog(@"DOWNLOAD FROM URL: %@", self.postView.videoView.videoURL);
 | 
				
			||||||
 | 
						UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
							[sender setEnabled:YES];
 | 
				
			||||||
 | 
					        // Cancel button tappped.
 | 
				
			||||||
 | 
							[[[UIApplication sharedApplication] keyWindow].rootViewController  dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Save Video" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
							MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self animated:YES];
 | 
				
			||||||
 | 
							hud.label.text = @"Downloading";
 | 
				
			||||||
 | 
							dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 | 
				
			||||||
 | 
								NSLog(@"Downloading Started");
 | 
				
			||||||
 | 
								NSURL  *url = self.postView.videoView.videoURL;
 | 
				
			||||||
 | 
								NSData *urlData = [NSData dataWithContentsOfURL:url];
 | 
				
			||||||
 | 
								if ( urlData )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 | 
				
			||||||
 | 
									NSString  *documentsDirectory = [paths objectAtIndex:0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									NSString  *filePath = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"tempVideo.mp4"];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									dispatch_async(dispatch_get_main_queue(), ^{
 | 
				
			||||||
 | 
										hud.label.text = @"Saving";
 | 
				
			||||||
 | 
										[urlData writeToFile:filePath atomically:YES];
 | 
				
			||||||
 | 
										NSLog(@"File Saved !");
 | 
				
			||||||
 | 
										hud.label.text = @"Importing";
 | 
				
			||||||
 | 
										[sender setEnabled:YES];
 | 
				
			||||||
 | 
										NSArray       *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 | 
				
			||||||
 | 
										NSString  *documentsDirectory = [paths objectAtIndex:0];
 | 
				
			||||||
 | 
										[[[ALAssetsLibrary alloc] init] writeVideoAtPathToSavedPhotosAlbum:[NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", documentsDirectory,@"tempVideo.mp4"]] completionBlock:^(NSURL *assetURL, NSError *error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											if(assetURL) {
 | 
				
			||||||
 | 
												hud.label.text = @"DONE!";
 | 
				
			||||||
 | 
												[hud hideAnimated:YES];
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												hud.label.text = @"ERROR. Try Again.";
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									});
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[[UIApplication sharedApplication] keyWindow].rootViewController dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Present action sheet.
 | 
				
			||||||
 | 
						[[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:actionSheet animated:YES completion:nil];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//%hook FLVideoContentHolderView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//FL_doubleTapOnpost
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					%hook FLAVPlayerLayerView
 | 
				
			||||||
 | 
					-(id)init {
 | 
				
			||||||
 | 
						NSLog(@"IW HAVE BEEN INITIATEDDDDDDDDDDDDDD");
 | 
				
			||||||
 | 
						UILongPressGestureRecognizer *longPress = [[[UILongPressGestureRecognizer alloc]
 | 
				
			||||||
 | 
							initWithTarget:self 
 | 
				
			||||||
 | 
							action:@selector(handleLongPress:)] autorelease];
 | 
				
			||||||
 | 
						longPress.minimumPressDuration = 2.0;
 | 
				
			||||||
 | 
						[self addGestureRecognizer:longPress];
 | 
				
			||||||
 | 
						return %orig;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%new
 | 
				
			||||||
 | 
					-(void)handleLongPress:(UILongPressGestureRecognizer *)sender
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						NSLog(@"Video URL: %@", self.videoView.videoURL);
 | 
				
			||||||
 | 
						UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Cancel button tappped.
 | 
				
			||||||
 | 
							[[[UIApplication sharedApplication] keyWindow].rootViewController  dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[actionSheet addAction:[UIAlertAction actionWithTitle:@"Save Image" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							UIImage *snapshot = [self.photoView image];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:snapshot];
 | 
				
			||||||
 | 
								changeRequest.creationDate          = [NSDate date];
 | 
				
			||||||
 | 
							} 
 | 
				
			||||||
 | 
							completionHandler:^(BOOL success, NSError *error) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (success) 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"successfully saved");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else 
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									NSLog(@"error saving to photos: %@", error);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							[[[UIApplication sharedApplication] keyWindow].rootViewController dismissViewControllerAnimated:YES completion:^{
 | 
				
			||||||
 | 
							}];
 | 
				
			||||||
 | 
						}]];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Present action sheet.
 | 
				
			||||||
 | 
						[[[UIApplication sharedApplication] keyWindow].rootViewController presentViewController:actionSheet animated:YES completion:nil];
 | 
				
			||||||
 | 
					}*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								bkstg.plist
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bkstg.plist
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{ Filter = { Bundles = ( "com.bkstg" ); }; }
 | 
				
			||||||
							
								
								
									
										12
									
								
								control
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								control
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					Package: gg.gh0stbyte.bkstg
 | 
				
			||||||
 | 
					Name: Bkstg Plus
 | 
				
			||||||
 | 
					Depends: mobilesubstrate
 | 
				
			||||||
 | 
					Version: 1.0.0
 | 
				
			||||||
 | 
					Architecture: iphoneos-arm
 | 
				
			||||||
 | 
					Description: Save Media from Bkstg
 | 
				
			||||||
 | 
					  Download photos & videos using this tweak. This tweak was suggested by /u/marcelre. 
 | 
				
			||||||
 | 
					  Long-press photos to save
 | 
				
			||||||
 | 
					  Triple-tap videos to save
 | 
				
			||||||
 | 
					Maintainer: Gh0stByte <gh0stbyte01@gmail.com>
 | 
				
			||||||
 | 
					Author: Gh0stByte <gh0stbyte01@gmail.com>
 | 
				
			||||||
 | 
					Section: TweakBounty
 | 
				
			||||||
		Reference in New Issue
	
	Block a user