Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ yarn-error.log
# Android
local.properties
.idea/
.gradle/
.gradle/
**/xcuserdata/
8 changes: 6 additions & 2 deletions NativeChangeIcon.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export type IconChangeOptions = {
/** iOS only - prevents alert from appearing */
useUnsafeSupressAlert?: boolean;
}
export interface Spec extends TurboModule {
readonly getConstants: () => {};
changeIcon: (iconName?: string) => Promise<string>;
resetIcon: () => Promise<string>;
changeIcon: (iconName?: string, options?: IconChangeOptions) => Promise<string>;
resetIcon: (optionsv: IconChangeOptions) => Promise<string>;
getIcon: () => Promise<string>;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.module.annotations.ReactModule;

import java.util.HashSet;
Expand Down Expand Up @@ -60,7 +61,7 @@ public void getIcon(Promise promise) {
}

@ReactMethod
public void changeIcon(String iconName, Promise promise) {
public void changeIcon(String iconName, ReadableMap params, Promise promise) {
final Activity activity = getCurrentActivity();
final String activityName = activity.getComponentName().getClassName();
if (activity == null) {
Expand Down
30 changes: 25 additions & 5 deletions ios/ChangeIcon.mm
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ + (BOOL)requiresMainQueueSetup {
});
}

RCT_REMAP_METHOD(changeIcon, iconName:(NSString *)iconName resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
RCT_REMAP_METHOD(changeIcon, iconName:(NSString *)iconName options:(NSDictionary *)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
dispatch_async(dispatch_get_main_queue(), ^{

Bool useUnsafeSuppressAlert = [[options objectForKey: @"useUnsafeSuppressAlert"] boolValue];
NSError *error = nil;

if ([[UIApplication sharedApplication] supportsAlternateIcons] == NO) {
Expand All @@ -42,10 +44,28 @@ + (BOOL)requiresMainQueueSetup {
newIconName = iconName;
resolve(newIconName);
}

[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
return;
}];

if (useUnsafeSuppressAlert == true) {
@try {
typedef void (*setAlternateIconName)(NSObject *, SEL, NSString *, void (^)(NSError *));
NSString *selectorString = @"_setAlternateIconName:completionHandler:";
SEL selector = NSSelectorFromString(selectorString);
IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
setAlternateIconName method = (setAlternateIconName)imp;
method([UIApplication sharedApplication], selector, iconName, ^(NSError *error) {});
}
@catch {
// fallback on safe method
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
return;
}];
}
} else {
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
return;
}];
}

});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
9 changes: 7 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { NativeModules } from "react-native";

export const changeIcon = (iconName?: string): Promise<string> => NativeModules.ChangeIcon.changeIcon(iconName);
export const resetIcon = () => changeIcon();
export type IconChangeOptions = {
/** iOS only - prevents alert from appearing */
useUnsafeSupressAlert?: boolean;
}

export const changeIcon = (iconName?: string, options?: IconChangeOptions): Promise<string> => NativeModules.ChangeIcon.changeIcon(iconName, options);
export const resetIcon = (options?: IconChangeOptions) => changeIcon(undefined, options);
export const getIcon = (): Promise<string> => NativeModules.ChangeIcon.getIcon();