diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..310b10c --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# gitignore for Theos + +*.deb +_/ +theos/ +theos +.theos +packages/ +./packages/ +obj/ +./obj/ +obj +.DS_Store diff --git a/Info.plist b/Info.plist new file mode 100755 index 0000000..b719cf4 --- /dev/null +++ b/Info.plist @@ -0,0 +1,15 @@ + + + + + CFBundleDisplayName + Xing + DDNotificationExternalProviderClasses + + XingContactPhotoProvider + com.xing.XING + + DDNotificationExternalProviderAPIVersion + 1 + + diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..9efe414 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +ARCHS = armv7 arm64 + +include $(THEOS)/makefiles/common.mk + +BUNDLE_NAME = ShortLook-Xing +$(BUNDLE_NAME)_CFLAGS = -fobjc-arc +$(BUNDLE_NAME)_FILES = $(wildcard *.m) +$(BUNDLE_NAME)_FRAMEWORKS = UIKit +$(BUNDLE_NAME)_INSTALL_PATH = /Library/Dynastic/ShortLook/Plugins/ContactPhotoProviders + +include $(THEOS_MAKE_PATH)/bundle.mk + +BUNDLE_PATH = $($(BUNDLE_NAME)_INSTALL_PATH)/$(BUNDLE_NAME).bundle + +internal-stage:: + $(ECHO_NOTHING)mkdir -p $(THEOS_STAGING_DIR)$(BUNDLE_PATH)$(ECHO_END) + $(ECHO_NOTHING)cp Info.plist $(THEOS_STAGING_DIR)$(BUNDLE_PATH)/Info.plist$(ECHO_END) + +after-install:: + install.exec "killall -9 SpringBoard" diff --git a/README.md b/README.md new file mode 100755 index 0000000..0d8656f --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Xing Contact Photo Provider for ShortLook + +Show Xing users' profile pictures in ShortLook when you receive a Xing notification! + +(This is not ShortLook itself, but a plugin for it) diff --git a/ShortLook-API.h b/ShortLook-API.h new file mode 100755 index 0000000..2c5cc07 --- /dev/null +++ b/ShortLook-API.h @@ -0,0 +1,107 @@ +// +// WARNING: +// This file contains the required headers to compile a tweak that +// interacts with ShortLook's contact photo API. Do not modify the +// headers within, or it could lead to unexpected behaviour. +// +// --- +// +// ShortLook-API.h +// +// Created by AppleBetas on 2018-05-18. +// Copyright © 2018 Dynastic Development. All rights reserved. +// + +#import +@class NCNotificationRequest, UNNotificationContent; + +/// A ShortLook-displayable notification representing a real user notification sent by an application to the system. +@interface DDUserNotification : NSObject +/// A custom notification title, separate from the application's title. +@property (nonatomic, retain, readonly) NSString *notificationTitle; + +/// A dictionary of any extra information included by ShortLook. +@property (nonatomic, retain) NSDictionary *userInfo; + +/// The system notification request that created this notification. +@property (nonatomic, readonly, retain) NCNotificationRequest *request; + +/// The user notification's content, sent by the application. +- (UNNotificationContent *)content; + +/// A dictionary of any extra information provided by the application sending the notification. +- (NSDictionary *)applicationUserInfo; + +/// The bundle identifier of the application this notification represents. +- (NSString *)senderIdentifier; +@end + +/// An object representing settings for the photo to be provided by a promise. +@interface DDNotificationContactPhotoSettings: NSObject +/// The background colour to show for the contact photo view if the provided image contains any transparency. +@property (nonatomic, retain) UIColor *backgroundColor; + +/// Whether or not ShortLook should automatically cache the returned image from your provider and use it for all future notifications with the same photo identifier and application. +@property (nonatomic, assign) BOOL usesCaching; +@end + +/// A promise representing a commitment to providing a contact icon for a notification. +@interface DDNotificationContactPhotoPromise: NSObject +/// An object holding the settings pertaining to the photo to be displayed. +@property (nonatomic, retain) DDNotificationContactPhotoSettings *settings; + +/// Whether or not this promise has already been resolved or rejected. +@property (nonatomic, readonly, assign) BOOL isComplete; + +// MARK: - Provider methods + +/// Resolve this promise with the provided image, notifying ShortLook that you have received your image. +/// - NOTE: This method should only be ran from within `addResolver:`. +- (void)resolveWithImage:(UIImage *)image; + +/// Reject this promise, notifying ShortLook that you failed to receive an image. +/// - NOTE: This method should only be ran from within `addResolver:`. +- (void)reject; +@end + +/// An offer to fulfill a promise representing a commitment to providing a contact icon for a notification. +@interface DDNotificationContactPhotoPromiseOffer: NSObject +/// A unique identifier for the photo that will be provided by this promise. +@property (nonatomic, readonly, retain) NSString *photoIdentifier; + +/// A string to replace the notification's title with, if it is required for your provider's context. Set to "" to remove the provided notification's title. +@property (nonatomic, retain) NSString *titleOverride; + +/// A string to replace the notification's subtitle with, if it is required for your provider's context. Set to "" to remove the provided notification's subtitle. +@property (nonatomic, retain) NSString *subtitleOverride; + +/// A string to replace the notification's body with, if it is required for your provider's context. Set to "" to remove the provided notification's body. +@property (nonatomic, retain) NSString *bodyOverride; + +/// Initialize a promise with the provided photo identifier. +- (instancetype)initWithPhotoIdentifier:(NSString *)photoIdentifier; + +/// Create a promise offer that will return the image at the provided URL, if needed. ++ (instancetype)offerDownloadingPromiseWithPhotoIdentifier:(NSString *)photoIdentifier fromURL:(NSURL *)url; + +/// Create a promise offer that will return the image at the provided URL, if needed, with custom settings. ++ (instancetype)offerDownloadingPromiseWithPhotoIdentifier:(NSString *)photoIdentifier fromURL:(NSURL *)url withSettings:(DDNotificationContactPhotoSettings *)settings; + +/// Create a promise offer that will instantly return the provided image. ++ (instancetype)offerInstantlyResolvingPromiseWithPhotoIdentifier:(NSString *)photoIdentifier image:(UIImage *)image; + +/// Create a promise offer that will instantly return the provided image with custom settings. ++ (instancetype)offerInstantlyResolvingPromiseWithPhotoIdentifier:(NSString *)photoIdentifier image:(UIImage *)image withSettings:(DDNotificationContactPhotoSettings *)settings; + +/// Add the block that will run if your image is needed (as it will not be in some cases, such as if your image is already cached by ShortLook). +/// If your provider does any long-running or asynchronous operations, they should be done using this method. +/// Any code run inside the provider block will be performed on a background thread. +- (void)fulfillWithBlock:(void (^)(DDNotificationContactPhotoPromise *promise))block; +@end + +/// An object that can provide contact photos for ShortLook notifications. +@protocol DDNotificationContactPhotoProviding +@required +/// Returns an offer to fulfill a promise to provide a contact photo for a notification. +- (DDNotificationContactPhotoPromiseOffer *)contactPhotoPromiseOfferForNotification:(DDUserNotification *)notification; +@end diff --git a/XingContactPhotoProvider.h b/XingContactPhotoProvider.h new file mode 100755 index 0000000..71985ca --- /dev/null +++ b/XingContactPhotoProvider.h @@ -0,0 +1,5 @@ +#import "ShortLook-API.h" + +@interface XingContactPhotoProvider : NSObject + - (DDNotificationContactPhotoPromiseOffer *)contactPhotoPromiseOfferForNotification:(DDUserNotification *)notification; +@end diff --git a/XingContactPhotoProvider.m b/XingContactPhotoProvider.m new file mode 100755 index 0000000..502f8fe --- /dev/null +++ b/XingContactPhotoProvider.m @@ -0,0 +1,13 @@ +#import "XingContactPhotoProvider.h" + +@implementation XingContactPhotoProvider + - (DDNotificationContactPhotoPromiseOffer *)contactPhotoPromiseOfferForNotification:(DDUserNotification *)notification { + NSString *imageURLStr = [notification.applicationUserInfo valueForKeyPath:@"xng.photo_url"]; + if (!imageURLStr) return nil; + + NSURL *imageURL = [NSURL URLWithString:imageURLStr]; + if (!imageURL) return nil; + + return [NSClassFromString(@"DDNotificationContactPhotoPromiseOffer") offerDownloadingPromiseWithPhotoIdentifier:imageURLStr fromURL:imageURL]; + } +@end diff --git a/control b/control new file mode 100755 index 0000000..1f90a1a --- /dev/null +++ b/control @@ -0,0 +1,9 @@ +Package: ch.marcoroth.shortlook.plugin.contact-photo.xing +Name: Xing Profile Pictures for ShortLook +Depends: mobilesubstrate, co.dynastic.ios.tweak.shortlook +Version: 1.0.0 +Architecture: iphoneos-arm +Description: Show Xing users' profile pictures in ShortLook when you receive a Xing notification! +Maintainer: Marco Roth +Author: Marco Roth +Section: Tweaks (ShortLook)