2 // Copyright 2011 The Android Open Source Project
4 // Build resource files from raw assets.
7 #ifndef RESOURCE_FILTER_H
8 #define RESOURCE_FILTER_H
10 #include <androidfw/ResourceTypes.h>
13 #include <utils/Errors.h>
14 #include <utils/String8.h>
15 #include <utils/StrongPointer.h>
16 #include <utils/Vector.h>
18 #include "AaptAssets.h"
19 #include "ConfigDescription.h"
21 class ResourceFilter : public virtual android::RefBase {
23 virtual bool match(const android::ResTable_config& config) const = 0;
27 * Implements logic for parsing and handling "-c" options.
29 class WeakResourceFilter : public ResourceFilter {
32 : mContainsPseudoAccented(false)
33 , mContainsPseudoBidi(false) {}
35 android::status_t parse(const android::String8& str);
37 bool match(const android::ResTable_config& config) const;
39 inline bool isEmpty() const {
40 return mConfigMask == 0;
43 inline bool containsPseudo() const {
44 return mContainsPseudoAccented;
47 inline bool containsPseudoBidi() const {
48 return mContainsPseudoBidi;
52 ConfigDescription mDefault;
54 android::Vector<std::pair<ConfigDescription, uint32_t> > mConfigs;
56 bool mContainsPseudoAccented;
57 bool mContainsPseudoBidi;
61 * Matches resources that have at least one of the configurations
62 * that this filter is looking for. In order to match a configuration,
63 * the resource must have the exact same configuration.
65 * This filter acts as a logical OR when matching resources.
67 * For example, if the filter is looking for resources with
68 * fr-land, de-land, or sw600dp:
78 class StrongResourceFilter : public ResourceFilter {
80 StrongResourceFilter() {}
81 StrongResourceFilter(const std::set<ConfigDescription>& configs)
82 : mConfigs(configs) {}
84 android::status_t parse(const android::String8& str);
86 bool match(const android::ResTable_config& config) const {
87 std::set<ConfigDescription>::const_iterator iter = mConfigs.begin();
88 for (; iter != mConfigs.end(); iter++) {
89 if (iter->compare(config) == 0) {
96 inline const std::set<ConfigDescription>& getConfigs() const {
101 std::set<ConfigDescription> mConfigs;
105 * Negates the response of the target filter.
107 class InverseResourceFilter : public ResourceFilter {
109 InverseResourceFilter(const android::sp<ResourceFilter>& filter)
112 bool match(const android::ResTable_config& config) const {
113 return !mFilter->match(config);
117 const android::sp<ResourceFilter> mFilter;
121 * A logical AND of all the added filters.
123 class AndResourceFilter : public ResourceFilter {
125 void addFilter(const android::sp<ResourceFilter>& filter) {
126 mFilters.add(filter);
129 bool match(const android::ResTable_config& config) const {
130 const size_t N = mFilters.size();
131 for (size_t i = 0; i < N; i++) {
132 if (!mFilters[i]->match(config)) {
140 android::Vector<android::sp<ResourceFilter> > mFilters;