Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18b5ac2e authored by Mark Punzalan's avatar Mark Punzalan Committed by Android (Google) Code Review
Browse files

Merge changes I5bd1d397,I17dbe433 into main

* changes:
  aapt2: (De-)Serialize minor version in config
  aapt2: Parse minor version in version qualifier
parents 3acd0970 9233954c
Loading
Loading
Loading
Loading
+51 −7
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "androidfw/StringPiece.h"
#include "androidfw/Util.h"

#include <charconv>
#include <string>
#include <string_view>
#include <vector>
@@ -628,7 +629,7 @@ static bool parseScreenHeightDp(const char* name, ResTable_config* out) {
  return true;
}

static bool parseVersion(const char* name, ResTable_config* out) {
static bool parseVersion(const char* const name, ResTable_config* out) {
  if (strcmp(name, kWildcardName) == 0) {
    if (out) {
      out->sdkVersion = out->SDKVERSION_ANY;
@@ -641,15 +642,55 @@ static bool parseVersion(const char* name, ResTable_config* out) {
    return false;
  }

  name++;
  const char* s = name;
  const char* start = name + 1;
  const char* s = start;
  while (*s >= '0' && *s <= '9') s++;
  if (s == name || *s != 0) return false;
  std::string sdkName(name, s - name);
  if (s == start) return false;

  uint16_t sdkVersion = 0;
  auto result = std::from_chars(start, s, sdkVersion);
  if (result.ec != std::errc()) {
    return false;
  }

  if (out) {
    out->sdkVersion = (uint16_t)atoi(sdkName.c_str());
    out->sdkVersion = sdkVersion;
  }

  if (*s == 0) {
    // No minor version specified
    out->minorVersion = 0;
    return true;
  }

  // Minor version starts after '.'
  if (*s != '.') {
    return false;
  }

  start = s + 1;
  s = start;
  while (*s >= '0' && *s <= '9') {
    s++;
  }
  if (s == start || *s != 0) {
    return false;
  }

  uint16_t minorVersion = 0;
  result = std::from_chars(start, s, minorVersion);
  if (result.ec != std::errc()) {
    return false;
  }

  // sdkVersion of 0 is not really valid, even though we allow it to be parsed. Therefore if it's 0,
  // we shouldn't allow a minorVersion (unless it's also 0).
  if (sdkVersion == 0 && minorVersion != 0) {
    return false;
  }

  if (out) {
    out->minorVersion = minorVersion;
  }

  return true;
@@ -857,7 +898,9 @@ success:
void ConfigDescription::ApplyVersionForCompatibility(
    ConfigDescription* config) {
  uint16_t min_sdk = 0;
  if (config->grammaticalInflection != 0) {
  if (config->minorVersion != 0) {
    min_sdk = SDK_BAKLAVA;
  } else if (config->grammaticalInflection != 0) {
    min_sdk = SDK_U;
  } else if ((config->uiMode & ResTable_config::MASK_UI_MODE_TYPE)
                == ResTable_config::UI_MODE_TYPE_VR_HEADSET ||
@@ -894,6 +937,7 @@ void ConfigDescription::ApplyVersionForCompatibility(
ConfigDescription ConfigDescription::CopyWithoutSdkVersion() const {
  ConfigDescription copy = *this;
  copy.sdkVersion = 0;
  copy.minorVersion = 0;
  return copy;
}

+2 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ enum : ApiVersion {
  SDK_S_V2 = 32,
  SDK_TIRAMISU = 33,
  SDK_U = 34,
  SDK_V = 35,
  SDK_BAKLAVA = 36,
};

/*
+68 −0
Original line number Diff line number Diff line
@@ -18,11 +18,14 @@
#include "androidfw/StringPiece.h"

#include "android-base/logging.h"
#include "android-base/stringprintf.h"

#include "gtest/gtest.h"

#include <string>

using ::android::base::StringPrintf;

namespace android {

static ::testing::AssertionResult TestParse(StringPiece input,
@@ -172,4 +175,69 @@ TEST(ConfigDescriptionTest, TestGrammaticalGenderQualifier) {
  EXPECT_EQ(std::string("neuter-v34"), config.toString().c_str());
}

TEST(ConfigDescriptionTest, ParseInvalidVersionQualifier) {
  ConfigDescription config;
  EXPECT_FALSE(TestParse("-v34"));
  EXPECT_FALSE(TestParse("v0.3"));
  EXPECT_FALSE(TestParse("v3x"));
  EXPECT_FALSE(TestParse("v34."));
  EXPECT_FALSE(TestParse("v34.x"));
  EXPECT_FALSE(TestParse("v34.1x"));
  EXPECT_FALSE(TestParse("v3x.1"));
  EXPECT_FALSE(TestParse("v34.1.1"));
  EXPECT_FALSE(TestParse("v.37"));
  EXPECT_FALSE(TestParse("300x200-v"));
  EXPECT_FALSE(TestParse("300x200-v0.3"));
  EXPECT_FALSE(TestParse("300x200-v3x"));
  EXPECT_FALSE(TestParse("300x200-v34."));
  EXPECT_FALSE(TestParse("300x200-v34.x"));
  EXPECT_FALSE(TestParse("300x200-v34.1x"));
  EXPECT_FALSE(TestParse("300x200-v3x.1"));
  EXPECT_FALSE(TestParse("300x200-v34.1.1"));
  EXPECT_FALSE(TestParse("300x200-v.37"));
}

TEST(ConfigDescriptionTest, ParseValidVersionQualifier) {
  ConfigDescription config;
  EXPECT_TRUE(TestParse("v34", &config));
  EXPECT_EQ(34, config.sdkVersion);
  EXPECT_EQ(0, config.minorVersion);
  EXPECT_STREQ("v34", config.toString());

  EXPECT_TRUE(TestParse("v0", &config));
  EXPECT_EQ(0, config.sdkVersion);
  EXPECT_EQ(0, config.minorVersion);
  EXPECT_STREQ("", config.toString());

  EXPECT_TRUE(TestParse("v34.0", &config));
  EXPECT_EQ(34, config.sdkVersion);
  EXPECT_EQ(0, config.minorVersion);
  EXPECT_STREQ("v34", config.toString());

  EXPECT_TRUE(TestParse("v19876", &config));
  EXPECT_EQ(19876, config.sdkVersion);
  EXPECT_EQ(0, config.minorVersion);
  EXPECT_STREQ("v19876", config.toString());

  EXPECT_TRUE(TestParse("v19876.000", &config));
  EXPECT_EQ(19876, config.sdkVersion);
  EXPECT_EQ(0, config.minorVersion);
  EXPECT_STREQ("v19876", config.toString());

  EXPECT_TRUE(TestParse("v19876.23450", &config));
  EXPECT_EQ(19876, config.sdkVersion);
  EXPECT_EQ(23450, config.minorVersion);
  EXPECT_STREQ("v19876.23450", config.toString());

  EXPECT_TRUE(TestParse("v019876.023450", &config));
  EXPECT_EQ(19876, config.sdkVersion);
  EXPECT_EQ(23450, config.minorVersion);
  EXPECT_STREQ("v19876.23450", config.toString());

  EXPECT_TRUE(TestParse("v34.1", &config));
  EXPECT_EQ(SDK_BAKLAVA, config.sdkVersion);
  EXPECT_EQ(1, config.minorVersion);
  EXPECT_STREQ(StringPrintf("v%d.1", SDK_BAKLAVA).c_str(), config.toString());
}

}  // namespace android
+6 −1
Original line number Diff line number Diff line
@@ -202,9 +202,12 @@ message Configuration {
  // (trackball, wheel, dpad, etc.).
  Navigation navigation = 23;

  // The minimum SDK version of the device.
  // The SDK version of the device.
  uint32 sdk_version = 24;

  // The SDK minor version of the device.
  uint32 sdk_version_minor = 27;

  // Grammatical gender.
  GrammaticalGender grammatical_gender = 26;

@@ -213,4 +216,6 @@ message Configuration {
  //

  string product = 25;

  reserved 28 to max;  // Next IDs
}
+1 −0
Original line number Diff line number Diff line
@@ -355,6 +355,7 @@ bool DeserializeConfigFromPb(const pb::Configuration& pb_config, ConfigDescripti
  out_config->screenWidth = static_cast<uint16_t>(pb_config.screen_width());
  out_config->screenHeight = static_cast<uint16_t>(pb_config.screen_height());
  out_config->sdkVersion = static_cast<uint16_t>(pb_config.sdk_version());
  out_config->minorVersion = static_cast<uint16_t>(pb_config.sdk_version_minor());
  out_config->grammaticalInflection = pb_config.grammatical_gender();
  return true;
}
Loading