summaryrefslogtreecommitdiffstats
path: root/QuickActions/Tweak.x
diff options
context:
space:
mode:
authorCameron Katri <me@cameronkatri.com>2021-12-24 09:20:23 -0500
committerCameron Katri <me@cameronkatri.com>2021-12-24 09:20:23 -0500
commita2e2d87eb7352a9aaecea33da6aa27e55af4e38d (patch)
treed81c11c700866eb3041773dd9e3bbe1175678133 /QuickActions/Tweak.x
parent615b0aefe92fb5d7b1fae821f91eb98e3f403bfe (diff)
downloadtweaks-a2e2d87eb7352a9aaecea33da6aa27e55af4e38d.tar.gz
tweaks-a2e2d87eb7352a9aaecea33da6aa27e55af4e38d.tar.zst
tweaks-a2e2d87eb7352a9aaecea33da6aa27e55af4e38d.zip
QuickActions: Massive improvements
Relicense everything as AGPLv3
Diffstat (limited to 'QuickActions/Tweak.x')
-rw-r--r--QuickActions/Tweak.x256
1 files changed, 204 insertions, 52 deletions
diff --git a/QuickActions/Tweak.x b/QuickActions/Tweak.x
index 61d6a65..d5c21f5 100644
--- a/QuickActions/Tweak.x
+++ b/QuickActions/Tweak.x
@@ -1,12 +1,25 @@
+/*
+ * Copyright (C) 2021 Cameron Katri
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
#import <Foundation/NSUserDefaults.h>
+#import <CoreGraphics/CoreGraphics.h>
+#import <UIKit/UIKit.h>
#import "Tweak.h"
-static bool leftOn;
-static NSString *leftApp;
-static bool rightOn;
-static NSString *rightApp;
-
void openApplication(NSString *bundleID)
{
FBSOpenApplicationOptions* opts = [%c(FBSOpenApplicationOptions) optionsWithDictionary:@{
@@ -27,51 +40,197 @@ void openApplication(NSString *bundleID)
%hook CSQuickActionsView
+%property (nonatomic, retain) NSMutableArray * leftButtons;
+%property (nonatomic, retain) NSMutableArray * rightButtons;
+%property (nonatomic) BOOL leftOpen;
+%property (nonatomic) BOOL rightOpen;
+%property (nonatomic) BOOL collapseLeft;
+%property (nonatomic) BOOL collapseRight;
+
+-(id)initWithFrame:(CGRect)arg1 delegate:(id)arg2
+{
+ id o = %orig;
+
+ NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"com.cameronkatri.quickactions"];
+
+ NSArray *leftButtons = (NSArray*)[defaults objectForKey:@"leftButtons"];
+ NSArray *rightButtons = (NSArray*)[defaults objectForKey:@"rightButtons"];
+
+
+ self.leftButtons = [[NSMutableArray alloc] init];
+ self.rightButtons = [[NSMutableArray alloc] init];
+
+ self.collapseLeft = [leftButtons count] > 1 ? true : false;
+ self.leftOpen = !self.collapseLeft;
+
+ if ([leftButtons count] == 1) {
+ [self.flashlightButton setBundleID:leftButtons[0]];
+ } else if ([leftButtons count] > 1) {
+ [self.flashlightButton setImage:nil];
+ for (int i = 0; i < [leftButtons count]; i++) {
+ CSQuickActionsButton *button = [[CSQuickActionsButton alloc] initWithType:(i + 2)];
+ [button setBundleID:leftButtons[i]];
+
+ [button setBackgroundEffectViewGroupName:[self _buttonGroupName]];
+ [button setLegibilitySettings:[self legibilitySettings]];
+ [button setPermitted:1];
+
+ [self insertSubview:button belowSubview:self.flashlightButton];
+ [self _addTargetsToButton:button];
+ [self.leftButtons addObject:button];
+ }
+ }
+
+ self.collapseRight = [rightButtons count] > 1 ? true : false;
+ self.rightOpen = !self.collapseRight;
+
+ if ([rightButtons count] == 1) {
+ [self.cameraButton setBundleID:rightButtons[0]];
+ } else if ([rightButtons count] > 1) {
+ [self.cameraButton setImage:nil];
+ for (int i = 0; i < [rightButtons count]; i++) {
+ CSQuickActionsButton *button = [[CSQuickActionsButton alloc] initWithType:(i + 2)];
+ [button setBundleID:rightButtons[i]];
+
+ [button setBackgroundEffectViewGroupName:[self _buttonGroupName]];
+ [button setLegibilitySettings:[self legibilitySettings]];
+ [button setPermitted:1];
+
+ [self insertSubview:button belowSubview:self.cameraButton];
+ [self _addTargetsToButton:button];
+ [self.rightButtons addObject:button];
+ }
+ }
+
+ return o;
+}
+
+%new
+-(CGRect)rightFrameForButton:(CSQuickActionsButton*)button
+{
+ CGRect cameraFrame = [[self cameraButton] frame];
+ if (self.rightOpen) {
+ return CGRectMake(cameraFrame.origin.x,
+ cameraFrame.origin.y - ((cameraFrame.size.height * 3/4) * ((button.type + 1) / 2)),
+ cameraFrame.size.width, cameraFrame.size.height);
+ } else {
+ return cameraFrame;
+ }
+}
+
+%new
+-(CGRect)leftFrameForButton:(CSQuickActionsButton*)button
+{
+ CGRect flashlightFrame = [[self flashlightButton] frame];
+ if (self.leftOpen) {
+ return CGRectMake(flashlightFrame.origin.x,
+ flashlightFrame.origin.y - ((flashlightFrame.size.height * 3/4) * (button.type - 1)),
+ flashlightFrame.size.width, flashlightFrame.size.height);
+ } else {
+ return flashlightFrame;
+ }
+}
+
+-(void)setLegibilitySettings:(id)legibilitySettings
+{
+ %orig;
+ for (CSQuickActionsButton *button in [self leftButtons])
+ [button setLegibilitySettings:legibilitySettings];
+ for (CSQuickActionsButton *button in [self rightButtons])
+ [button setLegibilitySettings:legibilitySettings];
+}
+
+-(void)_layoutQuickActionButtons
+{
+ %orig;
+
+ UIEdgeInsets insets = [self _buttonOutsets];
+ if (SBFEffectiveHomeButtonType() != 2) {
+ CGRect bounds = [[UIScreen mainScreen] _referenceBounds];
+
+ CGFloat buttonWidth = 50 + insets.right + insets.left;
+ CGFloat buttonHeight = 50 + insets.top + insets.bottom;
+
+ [[self flashlightButton] setEdgeInsets:insets];
+
+ self.flashlightButton.frame = CGRectMake(insets.left,
+ bounds.size.height - buttonHeight - insets.bottom,
+ buttonWidth, buttonHeight);
+
+ [[self cameraButton] setEdgeInsets:insets];
+
+ self.cameraButton.frame = CGRectMake(bounds.size.width - insets.left - buttonWidth,
+ bounds.size.height - buttonHeight - insets.bottom,
+ buttonWidth, buttonHeight);
+
+ }
+
+ for (CSQuickActionsButton *button in [self leftButtons]) {
+ [button setEdgeInsets:insets];
+ button.frame = [self leftFrameForButton:button];
+ }
+ for (CSQuickActionsButton *button in [self rightButtons]) {
+ [button setEdgeInsets:insets];
+ button.frame = [self rightFrameForButton:button];
+ }
+}
+
-(void)handleButtonPress:(CSQuickActionsButton *)button
{
[button setSelected:false];
- if (leftOn && button.type == 1)
- openApplication(leftApp);
- else if (rightOn && button.type == 0)
- openApplication(rightApp);
- else
+
+ if (button.type == 0 && self.collapseRight) {
+ [UIView animateWithDuration:0.25
+ delay:0
+ options:UIViewAnimationOptionCurveEaseOut
+ animations:^(void){
+ for (CSQuickActionsButton *button in [self rightButtons]) {
+ button.frame = [self rightFrameForButton:button];
+ }
+ }
+ completion:NULL];
+ self.rightOpen = !self.rightOpen;
+ } else if (button.type == 1 && self.collapseLeft) {
+ [UIView animateWithDuration:0.25
+ delay:0
+ options:UIViewAnimationOptionCurveEaseOut
+ animations:^(void){
+ for (CSQuickActionsButton *button in [self leftButtons]) {
+ button.frame = [self leftFrameForButton:button];
+ }
+ }
+ completion:NULL];
+ self.leftOpen = !self.leftOpen;
+ } else if (button.bundleID) {
+ openApplication(button.bundleID);
+ } else
%orig;
return;
}
-(void)handleButtonTouchBegan:(CSQuickActionsButton *)button
{
- if ((leftOn && button.type == 1) ||
- (rightOn && button.type == 0))
+ if (button.bundleID != nil ||
+ (button.type == 0 && self.collapseRight) ||
+ (button.type == 1 && self.collapseLeft))
return;
- else
- %orig;
+ %orig;
}
-(void)handleButtonTouchEnded:(CSQuickActionsButton *)button
{
- if ((leftOn && button.type == 1) ||
- (rightOn && button.type == 0))
+ if (button.bundleID != nil ||
+ (button.type == 0 && self.collapseRight) ||
+ (button.type == 1 && self.collapseLeft))
return;
- else
- %orig;
+ %orig;
}
%end
%hook CSQuickActionsButton
-%property (nonatomic, retain) UIImage *originalImage;
-
--(id)initWithType:(long long)type
-{
- id o = %orig;
- if (!self.originalImage)
- self.originalImage = [self image];
- [self loadImage];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadImage) name:@"com.cameronkatri.quickactions/ReloadImages" object:nil];
- return o;
-}
+%property (nonatomic, retain) NSString *bundleID;
-(void)setImage:(UIImage *)img
{
@@ -79,38 +238,31 @@ void openApplication(NSString *bundleID)
[[self valueForKey:@"_contentView"] setImage:img];
}
-%new
--(void)loadImage
+-(void)setBundleID:(NSString*)bundleID
{
- if (self.type == 1 && leftOn)
- [self setImage:[UIImage _applicationIconImageForBundleIdentifier:leftApp format:0 scale:[UIScreen mainScreen].scale]];
- else if (self.type == 0 && rightOn)
- [self setImage:[UIImage _applicationIconImageForBundleIdentifier:rightApp format:0 scale:[UIScreen mainScreen].scale]];
- else
- [self setImage:self.originalImage];
+ %orig;
+ [self setImage:[UIImage _applicationIconImageForBundleIdentifier:bundleID format:0 scale:[UIScreen mainScreen].scale]];
}
%end
-static void updatePrefs(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userinfo)
+%hook CSQuickActionsViewController
+
+-(BOOL)hasCamera
{
- NSNumber *leftOnValue = (NSNumber *)[[NSUserDefaults standardUserDefaults] objectForKey:@"leftOn" inDomain:@"com.cameronkatri.quickactions"];
- NSNumber *rightOnValue = (NSNumber *)[[NSUserDefaults standardUserDefaults] objectForKey:@"rightOn" inDomain:@"com.cameronkatri.quickactions"];
- leftApp = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:@"leftApp" inDomain:@"com.cameronkatri.quickactions"];
- rightApp = (NSString *)[[NSUserDefaults standardUserDefaults] objectForKey:@"rightApp" inDomain:@"com.cameronkatri.quickactions"];
- leftOn = leftOnValue ? [leftOnValue boolValue] : false;
- rightOn = leftOnValue ? [rightOnValue boolValue] : false;
- if ([leftApp isEqual:@""] || [leftApp length] == 0)
- leftOn = false;
- if ([rightApp isEqual:@""] || [rightApp length] == 0)
- rightOn = false;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"com.cameronkatri.quickactions/ReloadImages" object:nil];
+ return true;
}
-%ctor
+-(BOOL)hasFlashlight
{
- updatePrefs(NULL, NULL, NULL, NULL, NULL);
- CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, updatePrefs, (CFStringRef)@"com.cameronkatri.quickactions/ReloadPrefs", NULL, CFNotificationSuspensionBehaviorCoalesce);
+ return true;
}
++(BOOL)deviceSupportsButtons
+{
+ return true;
+}
+
+%end
+
// vim: filetype=logos