Skip to content

Commit

Permalink
Support non string values for default values
Browse files Browse the repository at this point in the history
Summary: This diff adds support for non string values to the `idb set` family of commands.

Reviewed By: ideahitme

Differential Revision: D34144910

fbshipit-source-id: 7cef44beb521833dc2a1398fe320d6e9bc70b12b
  • Loading branch information
Andrea Tullis authored and facebook-github-bot committed Feb 14, 2022
1 parent b45c535 commit 33147af
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 17 deletions.
3 changes: 2 additions & 1 deletion FBSimulatorControl/Commands/FBSimulatorSettingsCommands.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,11 @@ NS_ASSUME_NONNULL_BEGIN
@param name preference name
@param value preference value
@param type preverence value type. If null defaults to `string`.
@param domain preference domain - optional
@return a Future that resolves when successful.
*/
- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value domain:(nullable NSString *)domain;
- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value type:(nullable NSString *)type domain:(nullable NSString *)domain;

/**
Gets a preference value by its name and domain. If domain not specified assumed to be Apple Global Domain
Expand Down
4 changes: 2 additions & 2 deletions FBSimulatorControl/Commands/FBSimulatorSettingsCommands.m
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,11 @@ - (instancetype)initWithSimulator:(FBSimulator *)simulator
}];
}

- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value domain:(nullable NSString *)domain;
- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value type:(nullable NSString *)type domain:(nullable NSString *)domain;
{
return [[FBPreferenceModificationStrategy
strategyWithSimulator:self.simulator]
setPreference:name value:value domain:domain];
setPreference:name value:value type: type domain:domain];
}

- (FBFuture<NSString *> *)getCurrentPreference:(NSString *)name domain:(nullable NSString *)domain;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,11 @@ NS_ASSUME_NONNULL_BEGIN
@param name preference name
@param value preference value
@param type preference value type. If null defaults to `string`.
@param domain preference domain - optional
@return a Future that resolves when successful.
*/
- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value domain:(nullable NSString *)domain;
- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value type:(nullable NSString *)type domain:(nullable NSString *)domain;
/**
Gets a preference value by its name and domain. If domain not specified assumed to be Apple Global Domain
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,13 +76,14 @@ - (NSString *)defaultsBinary
return [[self performDefaultsCommandWithArguments:arguments] mapReplace:NSNull.null];
}

- (FBFuture<NSNull *> *)setDefaultInDomain:(NSString *)domain key:(NSString *)key value:(NSString *)value
- (FBFuture<NSNull *> *)setDefaultInDomain:(NSString *)domain key:(NSString *)key value:(NSString *)value type:(NSString *)type
{
return [[self
performDefaultsCommandWithArguments:@[
@"write",
domain,
key,
[NSString stringWithFormat:@"-%@", type ? type : @"string"],
value,
]]
mapReplace:NSNull.null];
Expand Down Expand Up @@ -152,12 +153,12 @@ @implementation FBPreferenceModificationStrategy

static NSString *const AppleGlobalDomain = @"Apple Global Domain";

- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value domain:(nullable NSString *)domain
- (FBFuture<NSNull *> *)setPreference:(NSString *)name value:(NSString *)value type:(nullable NSString *)type domain:(nullable NSString *)domain
{
if (domain == nil) {
domain = AppleGlobalDomain;
}
return [self setDefaultInDomain:domain key:name value:value];
return [self setDefaultInDomain:domain key:name value:value type:type];
}

- (FBFuture<NSString *> *)getCurrentPreference:(NSString *)name domain:(nullable NSString *)domain
Expand Down
13 changes: 11 additions & 2 deletions idb/cli/commands/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from idb.common.command import CommandGroup
from idb.common.types import Client


_ENABLE = "enable"
_DISABLE = "disable"

Expand All @@ -36,6 +35,13 @@ def add_parser_arguments(self, parser: ArgumentParser) -> None:
help="Preference name",
type=str,
)
parser.add_argument(
"--type",
help="Specifies the type of the value to be set, for supported types see 'defaults get help' defaults to string. "
"Example of usage: idb set --domain com.apple.suggestions.plist SuggestionsAppLibraryEnabled --type bool true",
type=str,
default="string",
)
parser.add_argument(
"value",
help="Preference value",
Expand All @@ -58,7 +64,10 @@ async def run_with_client(self, args: Namespace, client: Client) -> None:
await client.set_hardware_keyboard(args.value == _ENABLE)
else:
await client.set_preference(
name=args.name, value=args.value, domain=args.domain
name=args.name,
value=args.value,
value_type=args.type,
domain=args.domain,
)


Expand Down
2 changes: 1 addition & 1 deletion idb/common/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ async def set_locale(self, locale_identifier: str) -> None:

@abstractmethod
async def set_preference(
self, name: str, value: str, domain: Optional[str]
self, name: str, value: str, value_type: str, domain: Optional[str]
) -> None:
pass

Expand Down
8 changes: 6 additions & 2 deletions idb/grpc/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -1232,12 +1232,16 @@ async def set_locale(self, locale_identifier: str) -> None:

@log_and_handle_exceptions
async def set_preference(
self, name: str, value: str, domain: Optional[str]
self, name: str, value: str, value_type: str, domain: Optional[str]
) -> None:
await self.stub.setting(
SettingRequest(
stringSetting=SettingRequest.StringSetting(
setting=AnySetting, value=value, name=name, domain=domain
setting=AnySetting,
value=value,
name=name,
value_type=value_type,
domain=domain,
)
)
)
Expand Down
3 changes: 2 additions & 1 deletion idb_companion/Server/FBIDBCommandExecutor.h
Original file line number Diff line number Diff line change
Expand Up @@ -374,10 +374,11 @@ This allows to avoid the permission popup the first time we open a deeplink
@param name preference name
@param value preference value
@param type preference value type
@param domain preference domain - optional
@return a Future that resolves when successful.
*/
- (FBFuture<NSNull *> *)set_preference:(NSString *)name value:(NSString *)value domain:(nullable NSString *)domain;
- (FBFuture<NSNull *> *)set_preference:(NSString *)name value:(NSString *)value type:(NSString *)type domain:(nullable NSString *)domain;

/**
Gets a preference value by its name and domain. If domain not specified assumed to be Apple Global Domain
Expand Down
6 changes: 3 additions & 3 deletions idb_companion/Server/FBIDBCommandExecutor.m
Original file line number Diff line number Diff line change
Expand Up @@ -490,12 +490,12 @@ - (instancetype)initWithTarget:(id<FBiOSTarget>)target storageManager:(FBIDBStor
}];
}

- (FBFuture<NSNull *> *)set_preference:(NSString *)name value:(NSString *)value domain:(nullable NSString *)domain
- (FBFuture<NSNull *> *)set_preference:(NSString *)name value:(NSString *)value type:(NSString *)type domain:(nullable NSString *)domain
{
return [[self
settingsCommands]
onQueue:self.target.workQueue fmap:^(id<FBSimulatorSettingsCommands> commands) {
return [commands setPreference:name value:value domain:domain];
return [commands setPreference:name value:value type:type domain:domain];
}];
}

Expand All @@ -513,7 +513,7 @@ - (instancetype)initWithTarget:(id<FBiOSTarget>)target storageManager:(FBIDBStor
return [[self
settingsCommands]
onQueue:self.target.workQueue fmap:^(id<FBSimulatorSettingsCommands> commands) {
return [commands setPreference:@"AppleLocale" value:identifier domain:nil];
return [commands setPreference:@"AppleLocale" value:identifier type:nil domain:nil];
}];
}

Expand Down
6 changes: 5 additions & 1 deletion idb_companion/Server/FBIDBServiceHandler.mm
Original file line number Diff line number Diff line change
Expand Up @@ -929,11 +929,15 @@ static void populate_companion_info(idb::CompanionInfo *info, id<FBEventReporter
NSError *error = nil;
NSString *name = nsstring_from_c_string(stringSetting.name().c_str());
NSString *value = nsstring_from_c_string(stringSetting.value().c_str());
NSString *type = nil;
if (stringSetting.value_type().length() > 0) {
type = nsstring_from_c_string(stringSetting.value_type().c_str());
}
NSString *domain = nil;
if (stringSetting.domain().length() > 0) {
domain = nsstring_from_c_string(stringSetting.domain().c_str());
}
NSNull *result = [[_commandExecutor set_preference:name value:value domain:domain] await:&error];
NSNull *result = [[_commandExecutor set_preference:name value:value type: type domain:domain] await:&error];
if (!result) {
return Status(grpc::StatusCode::INTERNAL, error.localizedDescription.UTF8String);
}
Expand Down
16 changes: 16 additions & 0 deletions proto/idb.proto
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,22 @@ message SettingRequest {
string value = 2;
string name = 3; // iff setting == ANY
string domain = 4; // assumed "Apple Global Domain" if empty
/*
* Currently supported value_types and corresponding values are:
* string <string_value>
* data <hex_digits>
* int[eger] <integer_value>
* float <floating-point_value>
* bool[ean] (true | false | yes | no)
* date <date_rep>
* array <value1> <value2> ...
* array-add <value1> <value2> ...
* dict <key1> <value1> <key2> <value2> ...
* dict-add <key1> <value1> ...
*
* Check defaults set help for more details.
*/
string value_type = 5;
}
oneof setting {
HardwareKeyboard hardwareKeyboard = 1;
Expand Down

0 comments on commit 33147af

Please sign in to comment.