// // Copyright 2011 The Android Open Source Project // // Build resource files from raw assets. // #ifndef RESOURCE_FILTER_H #define RESOURCE_FILTER_H #include #include #include #include #include #include #include #include "AaptAssets.h" #include "ConfigDescription.h" class ResourceFilter : public virtual android::RefBase { public: virtual bool match(const android::ResTable_config& config) const = 0; }; /** * Implements logic for parsing and handling "-c" options. */ class WeakResourceFilter : public ResourceFilter { public: WeakResourceFilter() : mContainsPseudoAccented(false) , mContainsPseudoBidi(false) {} android::status_t parse(const android::String8& str); bool match(const android::ResTable_config& config) const; inline bool isEmpty() const { return mConfigMask == 0; } inline bool containsPseudo() const { return mContainsPseudoAccented; } inline bool containsPseudoBidi() const { return mContainsPseudoBidi; } private: ConfigDescription mDefault; uint32_t mConfigMask; android::Vector > mConfigs; bool mContainsPseudoAccented; bool mContainsPseudoBidi; }; /** * Matches resources that have at least one of the configurations * that this filter is looking for. In order to match a configuration, * the resource must have the exact same configuration. * * This filter acts as a logical OR when matching resources. * * For example, if the filter is looking for resources with * fr-land, de-land, or sw600dp: * * (PASS) fr-land * (FAIL) fr * (PASS) de-land * (FAIL) de * (FAIL) de-sw600dp * (PASS) sw600dp * (FAIL) sw600dp-land */ class StrongResourceFilter : public ResourceFilter { public: StrongResourceFilter() {} explicit StrongResourceFilter(const std::set& configs) : mConfigs(configs) {} android::status_t parse(const android::String8& str); bool match(const android::ResTable_config& config) const { std::set::const_iterator iter = mConfigs.begin(); for (; iter != mConfigs.end(); iter++) { if (iter->compare(config) == 0) { return true; } } return false; } inline const std::set& getConfigs() const { return mConfigs; } private: std::set mConfigs; }; /** * Negates the response of the target filter. */ class InverseResourceFilter : public ResourceFilter { public: explicit InverseResourceFilter(const android::sp& filter) : mFilter(filter) {} bool match(const android::ResTable_config& config) const { return !mFilter->match(config); } private: const android::sp mFilter; }; /** * A logical AND of all the added filters. */ class AndResourceFilter : public ResourceFilter { public: void addFilter(const android::sp& filter) { mFilters.add(filter); } bool match(const android::ResTable_config& config) const { const size_t N = mFilters.size(); for (size_t i = 0; i < N; i++) { if (!mFilters[i]->match(config)) { return false; } } return true; } private: android::Vector > mFilters; }; #endif