Merge "Allow string type when fabricating FRROs"
This commit is contained in:
@@ -234,7 +234,11 @@ Status Idmap2Service::createFabricatedOverlay(
|
||||
}
|
||||
|
||||
for (const auto& res : overlay.entries) {
|
||||
builder.SetResourceValue(res.resourceName, res.dataType, res.data);
|
||||
if (res.dataType == Res_value::TYPE_STRING) {
|
||||
builder.SetResourceValue(res.resourceName, res.dataType, res.stringData.value());
|
||||
} else {
|
||||
builder.SetResourceValue(res.resourceName, res.dataType, res.data);
|
||||
}
|
||||
}
|
||||
|
||||
// Generate the file path of the fabricated overlay and ensure it does not collide with an
|
||||
|
||||
@@ -23,4 +23,5 @@ parcelable FabricatedOverlayInternalEntry {
|
||||
@utf8InCpp String resourceName;
|
||||
int dataType;
|
||||
int data;
|
||||
@nullable @utf8InCpp String stringData;
|
||||
}
|
||||
@@ -41,6 +41,9 @@ struct FabricatedOverlay {
|
||||
Builder& SetResourceValue(const std::string& resource_name, uint8_t data_type,
|
||||
uint32_t data_value);
|
||||
|
||||
Builder& SetResourceValue(const std::string& resource_name, uint8_t data_type,
|
||||
const std::string& data_string_value);
|
||||
|
||||
WARN_UNUSED Result<FabricatedOverlay> Build();
|
||||
|
||||
private:
|
||||
@@ -48,6 +51,7 @@ struct FabricatedOverlay {
|
||||
std::string resource_name;
|
||||
DataType data_type;
|
||||
DataValue data_value;
|
||||
std::string data_string_value;
|
||||
};
|
||||
|
||||
std::string package_name_;
|
||||
|
||||
@@ -40,6 +40,7 @@ using DataValue = uint32_t; // Res_value::data
|
||||
struct TargetValue {
|
||||
DataType data_type;
|
||||
DataValue data_value;
|
||||
std::string data_string_value;
|
||||
};
|
||||
|
||||
namespace utils {
|
||||
|
||||
@@ -65,7 +65,13 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetOverlayable(const std
|
||||
|
||||
FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue(
|
||||
const std::string& resource_name, uint8_t data_type, uint32_t data_value) {
|
||||
entries_.emplace_back(Entry{resource_name, data_type, data_value});
|
||||
entries_.emplace_back(Entry{resource_name, data_type, data_value, ""});
|
||||
return *this;
|
||||
}
|
||||
|
||||
FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue(
|
||||
const std::string& resource_name, uint8_t data_type, const std::string& data_string_value) {
|
||||
entries_.emplace_back(Entry{resource_name, data_type, 0, data_string_value});
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -111,7 +117,8 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() {
|
||||
entry = type->second.insert(std::make_pair(entry_name.to_string(), TargetValue())).first;
|
||||
}
|
||||
|
||||
entry->second = TargetValue{res_entry.data_type, res_entry.data_value};
|
||||
entry->second = TargetValue{
|
||||
res_entry.data_type, res_entry.data_value, res_entry.data_string_value};
|
||||
}
|
||||
|
||||
pb::FabricatedOverlay overlay_pb;
|
||||
|
||||
@@ -88,7 +88,7 @@ public class FabricatedOverlay {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of
|
||||
* Sets the value of the fabricated overlay
|
||||
*
|
||||
* @param resourceName name of the target resource to overlay (in the form
|
||||
* [package]:type/entry)
|
||||
@@ -106,6 +106,25 @@ public class FabricatedOverlay {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the value of the fabricated overlay
|
||||
*
|
||||
* @param resourceName name of the target resource to overlay (in the form
|
||||
* [package]:type/entry)
|
||||
* @param dataType the data type of the new value
|
||||
* @param value the string representing the new value
|
||||
*
|
||||
* @see android.util.TypedValue#type
|
||||
*/
|
||||
public Builder setResourceValue(@NonNull String resourceName, int dataType, String value) {
|
||||
final FabricatedOverlayInternalEntry entry = new FabricatedOverlayInternalEntry();
|
||||
entry.resourceName = resourceName;
|
||||
entry.dataType = dataType;
|
||||
entry.stringData = value;
|
||||
mEntries.add(entry);
|
||||
return this;
|
||||
}
|
||||
|
||||
/** Builds an immutable fabricated overlay. */
|
||||
public FabricatedOverlay build() {
|
||||
final FabricatedOverlayInternal overlay = new FabricatedOverlayInternal();
|
||||
|
||||
@@ -62,7 +62,8 @@ final class OverlayManagerShellCommand extends ShellCommand {
|
||||
private final Context mContext;
|
||||
private final IOverlayManager mInterface;
|
||||
private static final Map<String, Integer> TYPE_MAP = Map.of(
|
||||
"color", TypedValue.TYPE_FIRST_COLOR_INT);
|
||||
"color", TypedValue.TYPE_FIRST_COLOR_INT,
|
||||
"string", TypedValue.TYPE_STRING);
|
||||
|
||||
OverlayManagerShellCommand(@NonNull final Context ctx, @NonNull final IOverlayManager iom) {
|
||||
mContext = ctx;
|
||||
@@ -390,13 +391,17 @@ final class OverlayManagerShellCommand extends ShellCommand {
|
||||
type = Integer.parseUnsignedInt(typeString);
|
||||
}
|
||||
}
|
||||
final int intData;
|
||||
if (valueString.startsWith("0x")) {
|
||||
intData = Integer.parseUnsignedInt(valueString.substring(2), 16);
|
||||
if (type == TypedValue.TYPE_STRING) {
|
||||
overlayBuilder.setResourceValue(resourceName, type, valueString);
|
||||
} else {
|
||||
intData = Integer.parseUnsignedInt(valueString);
|
||||
final int intData;
|
||||
if (valueString.startsWith("0x")) {
|
||||
intData = Integer.parseUnsignedInt(valueString.substring(2), 16);
|
||||
} else {
|
||||
intData = Integer.parseUnsignedInt(valueString);
|
||||
}
|
||||
overlayBuilder.setResourceValue(resourceName, type, intData);
|
||||
}
|
||||
overlayBuilder.setResourceValue(resourceName, type, intData);
|
||||
}
|
||||
|
||||
private int runEnableExclusive() throws RemoteException {
|
||||
|
||||
Reference in New Issue
Block a user