Skip to content

Commit adbc3d9

Browse files
committed
Hide when not playing and saves state of all settings over restarts
1 parent acae56b commit adbc3d9

File tree

5 files changed

+135
-23
lines changed

5 files changed

+135
-23
lines changed

Statusfy.xcodeproj/project.pbxproj

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,21 @@
205205
isa = PBXProject;
206206
attributes = {
207207
CLASSPREFIX = SFY;
208-
LastUpgradeCheck = 0510;
208+
LastUpgradeCheck = 1010;
209209
ORGANIZATIONNAME = "Paul Young";
210210
TargetAttributes = {
211+
2C87974B18FF06E600AE2A45 = {
212+
DevelopmentTeam = 3J3Y9DQDHA;
213+
ProvisioningStyle = Automatic;
214+
SystemCapabilities = {
215+
com.apple.ApplicationGroups.Mac = {
216+
enabled = 0;
217+
};
218+
com.apple.Sandbox = {
219+
enabled = 0;
220+
};
221+
};
222+
};
211223
2C87976C18FF06E600AE2A45 = {
212224
TestTargetID = 2C87974B18FF06E600AE2A45;
213225
};
@@ -328,18 +340,32 @@
328340
CLANG_CXX_LIBRARY = "libc++";
329341
CLANG_ENABLE_MODULES = YES;
330342
CLANG_ENABLE_OBJC_ARC = YES;
343+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
331344
CLANG_WARN_BOOL_CONVERSION = YES;
345+
CLANG_WARN_COMMA = YES;
332346
CLANG_WARN_CONSTANT_CONVERSION = YES;
347+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
333348
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
334349
CLANG_WARN_EMPTY_BODY = YES;
335350
CLANG_WARN_ENUM_CONVERSION = YES;
351+
CLANG_WARN_INFINITE_RECURSION = YES;
336352
CLANG_WARN_INT_CONVERSION = YES;
353+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
354+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
355+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
337356
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
357+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
358+
CLANG_WARN_STRICT_PROTOTYPES = YES;
359+
CLANG_WARN_SUSPICIOUS_MOVE = YES;
360+
CLANG_WARN_UNREACHABLE_CODE = YES;
338361
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
339362
COPY_PHASE_STRIP = NO;
363+
ENABLE_STRICT_OBJC_MSGSEND = YES;
364+
ENABLE_TESTABILITY = YES;
340365
GCC_C_LANGUAGE_STANDARD = gnu99;
341366
GCC_DYNAMIC_NO_PIC = NO;
342367
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
368+
GCC_NO_COMMON_BLOCKS = YES;
343369
GCC_OPTIMIZATION_LEVEL = 0;
344370
GCC_PREPROCESSOR_DEFINITIONS = (
345371
"DEBUG=1",
@@ -371,19 +397,32 @@
371397
CLANG_CXX_LIBRARY = "libc++";
372398
CLANG_ENABLE_MODULES = YES;
373399
CLANG_ENABLE_OBJC_ARC = YES;
400+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
374401
CLANG_WARN_BOOL_CONVERSION = YES;
402+
CLANG_WARN_COMMA = YES;
375403
CLANG_WARN_CONSTANT_CONVERSION = YES;
404+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
376405
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
377406
CLANG_WARN_EMPTY_BODY = YES;
378407
CLANG_WARN_ENUM_CONVERSION = YES;
408+
CLANG_WARN_INFINITE_RECURSION = YES;
379409
CLANG_WARN_INT_CONVERSION = YES;
410+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
411+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
412+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
380413
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
414+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
415+
CLANG_WARN_STRICT_PROTOTYPES = YES;
416+
CLANG_WARN_SUSPICIOUS_MOVE = YES;
417+
CLANG_WARN_UNREACHABLE_CODE = YES;
381418
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
382419
COPY_PHASE_STRIP = YES;
383420
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
384421
ENABLE_NS_ASSERTIONS = NO;
422+
ENABLE_STRICT_OBJC_MSGSEND = YES;
385423
GCC_C_LANGUAGE_STANDARD = gnu99;
386424
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
425+
GCC_NO_COMMON_BLOCKS = YES;
387426
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
388427
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
389428
GCC_WARN_UNDECLARED_SELECTOR = YES;
@@ -404,11 +443,16 @@
404443
isa = XCBuildConfiguration;
405444
buildSettings = {
406445
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
446+
CODE_SIGN_IDENTITY = "Mac Developer";
447+
CODE_SIGN_STYLE = Automatic;
407448
COMBINE_HIDPI_IMAGES = YES;
449+
DEVELOPMENT_TEAM = 3J3Y9DQDHA;
408450
GCC_PRECOMPILE_PREFIX_HEADER = YES;
409451
GCC_PREFIX_HEADER = "Statusfy/Statusfy-Prefix.pch";
410452
INFOPLIST_FILE = "Statusfy/Statusfy-Info.plist";
453+
PRODUCT_BUNDLE_IDENTIFIER = com.codingskies.Statusfy;
411454
PRODUCT_NAME = "$(TARGET_NAME)";
455+
PROVISIONING_PROFILE_SPECIFIER = "";
412456
WRAPPER_EXTENSION = app;
413457
};
414458
name = Debug;
@@ -417,11 +461,17 @@
417461
isa = XCBuildConfiguration;
418462
buildSettings = {
419463
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
464+
CODE_SIGN_ENTITLEMENTS = "";
465+
CODE_SIGN_IDENTITY = "Mac Developer";
466+
CODE_SIGN_STYLE = Automatic;
420467
COMBINE_HIDPI_IMAGES = YES;
468+
DEVELOPMENT_TEAM = 3J3Y9DQDHA;
421469
GCC_PRECOMPILE_PREFIX_HEADER = YES;
422470
GCC_PREFIX_HEADER = "Statusfy/Statusfy-Prefix.pch";
423471
INFOPLIST_FILE = "Statusfy/Statusfy-Info.plist";
472+
PRODUCT_BUNDLE_IDENTIFIER = com.codingskies.Statusfy;
424473
PRODUCT_NAME = "$(TARGET_NAME)";
474+
PROVISIONING_PROFILE_SPECIFIER = "";
425475
WRAPPER_EXTENSION = app;
426476
};
427477
name = Release;
@@ -442,6 +492,7 @@
442492
"$(inherited)",
443493
);
444494
INFOPLIST_FILE = "StatusfyTests/StatusfyTests-Info.plist";
495+
PRODUCT_BUNDLE_IDENTIFIER = "me.paulyoung.${PRODUCT_NAME:rfc1034identifier}";
445496
PRODUCT_NAME = "$(TARGET_NAME)";
446497
TEST_HOST = "$(BUNDLE_LOADER)";
447498
WRAPPER_EXTENSION = xctest;
@@ -460,6 +511,7 @@
460511
GCC_PRECOMPILE_PREFIX_HEADER = YES;
461512
GCC_PREFIX_HEADER = "Statusfy/Statusfy-Prefix.pch";
462513
INFOPLIST_FILE = "StatusfyTests/StatusfyTests-Info.plist";
514+
PRODUCT_BUNDLE_IDENTIFIER = "me.paulyoung.${PRODUCT_NAME:rfc1034identifier}";
463515
PRODUCT_NAME = "$(TARGET_NAME)";
464516
TEST_HOST = "$(BUNDLE_LOADER)";
465517
WRAPPER_EXTENSION = xctest;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEDidComputeMac32BitWarning</key>
6+
<true/>
7+
</dict>
8+
</plist>

Statusfy/SFYAppDelegate.m

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010

1111

1212
static NSString * const SFYPlayerStatePreferenceKey = @"ShowPlayerState";
13-
static NSString * const SFYPlayerDockIconPreferenceKey = @"YES";
13+
static NSString * const SFYHideIfNotPlayingKey = @"HideIfNotPlaying";
14+
static NSString * const SFYPlayerDockIconPreferenceKey = @"ShowPlayerDockIcon";
1415

1516
@interface SFYAppDelegate ()
1617

1718
@property (nonatomic, strong) NSMenuItem *playerStateMenuItem;
1819
@property (nonatomic, strong) NSMenuItem *dockIconMenuItem;
20+
@property (nonatomic, strong) NSMenuItem *hideIfNotPlayingItem;
1921
@property (nonatomic, strong) NSStatusItem *statusItem;
2022

2123
@end
@@ -24,20 +26,22 @@ @implementation SFYAppDelegate
2426

2527
- (void)applicationDidFinishLaunching:(NSNotification * __unused)aNotification
2628
{
27-
//Initialize the variable the getDockIconVisibility method checks
28-
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:SFYPlayerDockIconPreferenceKey];
29-
29+
[self showOrHideDockIcon];
30+
3031
self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
3132
self.statusItem.highlightMode = YES;
3233

3334
NSMenu *menu = [[NSMenu alloc] initWithTitle:@""];
3435

3536
self.playerStateMenuItem = [[NSMenuItem alloc] initWithTitle:[self determinePlayerStateMenuItemTitle] action:@selector(togglePlayerStateVisibility) keyEquivalent:@""];
3637

37-
self.dockIconMenuItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"Hide Dock Icon", nil) action:@selector(toggleDockIconVisibility) keyEquivalent:@""];
38+
self.dockIconMenuItem = [[NSMenuItem alloc] initWithTitle:[self determineDockIconMenuItemTitle] action:@selector(toggleDockIconVisibility) keyEquivalent:@""];
39+
40+
self.hideIfNotPlayingItem = [[NSMenuItem alloc] initWithTitle:[self determineHideIfNotPlayingMenuItemTitle] action:@selector(toggleHideIfNotPlaying) keyEquivalent:@""];
3841

3942
[menu addItem:self.playerStateMenuItem];
4043
[menu addItem:self.dockIconMenuItem];
44+
[menu addItem:self.hideIfNotPlayingItem];
4145
[menu addItemWithTitle:NSLocalizedString(@"Quit", nil) action:@selector(quit) keyEquivalent:@"q"];
4246

4347
[self.statusItem setMenu:menu];
@@ -53,23 +57,37 @@ - (void)setStatusItemTitle
5357
NSString *trackName = [[self executeAppleScript:@"get name of current track"] stringValue];
5458
NSString *artistName = [[self executeAppleScript:@"get artist of current track"] stringValue];
5559

56-
if (trackName && artistName) {
57-
NSString *titleText = [NSString stringWithFormat:@"%@ - %@", trackName, artistName];
58-
59-
if ([self getPlayerStateVisibility]) {
60-
NSString *playerState = [self determinePlayerStateText];
61-
titleText = [NSString stringWithFormat:@"%@ (%@)", titleText, playerState];
62-
}
63-
64-
self.statusItem.image = nil;
65-
self.statusItem.title = titleText;
60+
if ([self getHideIfNotPlaying] && ![self checkIfIsPlaying]) {
61+
[self showIconAndHideText];
6662
}
6763
else {
68-
NSImage *image = [NSImage imageNamed:@"status_icon"];
69-
[image setTemplate:true];
70-
self.statusItem.image = image;
71-
self.statusItem.title = nil;
64+
if (trackName && artistName) {
65+
NSString *titleText = [NSString stringWithFormat:@"%@ - %@", trackName, artistName];
66+
67+
if ([self getPlayerStateVisibility]) {
68+
NSString *playerState = [self determinePlayerStateText];
69+
titleText = [NSString stringWithFormat:@"%@ (%@)", titleText, playerState];
70+
}
71+
72+
[self hideIconAndDisplayText:titleText];
73+
}
74+
else {
75+
[self showIconAndHideText];
76+
}
7277
}
78+
79+
}
80+
81+
- (void)hideIconAndDisplayText:(NSString*)titleText {
82+
self.statusItem.image = nil;
83+
self.statusItem.title = titleText;
84+
}
85+
86+
- (void)showIconAndHideText {
87+
NSImage *image = [NSImage imageNamed:@"status_icon"];
88+
[image setTemplate:true];
89+
self.statusItem.image = image;
90+
self.statusItem.title = nil;
7391
}
7492

7593
#pragma mark - Executing AppleScript
@@ -105,6 +123,12 @@ - (NSString *)determinePlayerStateMenuItemTitle
105123
return [self getPlayerStateVisibility] ? NSLocalizedString(@"Hide Player State", nil) : NSLocalizedString(@"Show Player State", nil);
106124
}
107125

126+
- (BOOL)checkIfIsPlaying
127+
{
128+
NSString *playerStateConstant = [[self executeAppleScript:@"get player state"] stringValue];
129+
return [playerStateConstant isEqualToString:@"kPSP"];
130+
}
131+
108132
- (NSString *)determinePlayerStateText
109133
{
110134
NSString *playerStateText = nil;
@@ -125,6 +149,22 @@ - (NSString *)determinePlayerStateText
125149

126150
#pragma mark - Toggle Dock Icon
127151

152+
- (BOOL)getHideIfNotPlaying
153+
{
154+
return [[NSUserDefaults standardUserDefaults] boolForKey:SFYHideIfNotPlayingKey];
155+
}
156+
157+
-(void)setHideIfNotPlaying:(BOOL)hide
158+
{
159+
[[NSUserDefaults standardUserDefaults] setBool:hide forKey:SFYHideIfNotPlayingKey];
160+
}
161+
162+
- (void)toggleHideIfNotPlaying
163+
{
164+
[self setHideIfNotPlaying:![self getHideIfNotPlaying]];
165+
self.hideIfNotPlayingItem.title = [self determineHideIfNotPlayingMenuItemTitle];
166+
}
167+
128168
- (BOOL)getDockIconVisibility
129169
{
130170
return [[NSUserDefaults standardUserDefaults] boolForKey:SFYPlayerDockIconPreferenceKey];
@@ -139,7 +179,11 @@ - (void)toggleDockIconVisibility
139179
{
140180
[self setDockIconVisibility:![self getDockIconVisibility]];
141181
self.dockIconMenuItem.title = [self determineDockIconMenuItemTitle];
142-
182+
[self showOrHideDockIcon];
183+
}
184+
185+
- (void) showOrHideDockIcon
186+
{
143187
if(![self getDockIconVisibility])
144188
{
145189
//Apple recommended method to show and hide dock icon
@@ -153,6 +197,12 @@ - (void)toggleDockIconVisibility
153197
}
154198
}
155199

200+
- (NSString *)determineHideIfNotPlayingMenuItemTitle
201+
{
202+
return ![self getHideIfNotPlaying] ? NSLocalizedString(@"Hide If Not Playing", nil) :
203+
NSLocalizedString(@"Show Even If Not Playing", nil);
204+
}
205+
156206
- (NSString *)determineDockIconMenuItemTitle
157207
{
158208
return [self getDockIconVisibility] ? NSLocalizedString(@"Hide Dock Icon", nil) : NSLocalizedString(@"Show Dock Icon", nil);

Statusfy/Statusfy-Info.plist

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<key>CFBundleIconFile</key>
1010
<string></string>
1111
<key>CFBundleIdentifier</key>
12-
<string>me.paulyoung.${PRODUCT_NAME:rfc1034identifier}</string>
12+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1313
<key>CFBundleInfoDictionaryVersion</key>
1414
<string>6.0</string>
1515
<key>CFBundleName</key>
@@ -24,6 +24,8 @@
2424
<string>1</string>
2525
<key>LSApplicationCategoryType</key>
2626
<string>public.app-category.music</string>
27+
<key>NSAppleEventsUsageDescription</key>
28+
<string>This script needs to control other applications to run</string>
2729
<key>LSMinimumSystemVersion</key>
2830
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
2931
<key>NSHumanReadableCopyright</key>

StatusfyTests/StatusfyTests-Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<key>CFBundleExecutable</key>
88
<string>${EXECUTABLE_NAME}</string>
99
<key>CFBundleIdentifier</key>
10-
<string>me.paulyoung.${PRODUCT_NAME:rfc1034identifier}</string>
10+
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
1111
<key>CFBundleInfoDictionaryVersion</key>
1212
<string>6.0</string>
1313
<key>CFBundlePackageType</key>

0 commit comments

Comments
 (0)