140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski/* 240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * you may not use this file except in compliance with the License. 640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * You may obtain a copy of the License at 740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * 1040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * Unless required by applicable law or agreed to in writing, software 1140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * See the License for the specific language governing permissions and 1440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski * limitations under the License. 1540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski */ 1640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 1740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "Grouper.h" 1840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 19c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski#include "aapt/AaptUtil.h" 2040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include "SplitDescription.h" 2140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/KeyedVector.h> 2340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski#include <utils/Vector.h> 2440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2540e8eefbedcafc51948945647d746daaee092f16Adam Lesinskiusing namespace android; 26c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinskiusing AaptUtil::appendValue; 2740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 2840e8eefbedcafc51948945647d746daaee092f16Adam Lesinskinamespace split { 2940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 3040e8eefbedcafc51948945647d746daaee092f16Adam LesinskiVector<SortedVector<SplitDescription> > 3140e8eefbedcafc51948945647d746daaee092f16Adam LesinskigroupByMutualExclusivity(const Vector<SplitDescription>& splits) { 3240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski Vector<SortedVector<SplitDescription> > groups; 3340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 3440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski // Find mutually exclusive splits and group them. 3540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski KeyedVector<SplitDescription, SortedVector<SplitDescription> > densityGroups; 3640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski KeyedVector<SplitDescription, SortedVector<SplitDescription> > abiGroups; 3740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski KeyedVector<SplitDescription, SortedVector<SplitDescription> > localeGroups; 38c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski const size_t splitCount = splits.size(); 39c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski for (size_t i = 0; i < splitCount; i++) { 40c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski const SplitDescription& split = splits[i]; 4140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski if (split.config.density != 0) { 4240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski SplitDescription key(split); 4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.config.density = 0; 4440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.config.sdkVersion = 0; // Ignore density so we can support anydpi. 45c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski appendValue(densityGroups, key, split); 46c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski } else if (split.abi != abi::Variant_none) { 4740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski SplitDescription key(split); 48c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski key.abi = abi::Variant_none; 49c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski appendValue(abiGroups, key, split); 5040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } else if (split.config.locale != 0) { 5140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski SplitDescription key(split); 5240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski key.config.clearLocale(); 53c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski appendValue(localeGroups, key, split); 5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } else { 5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(); 5640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.editTop().add(split); 5740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 5840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 5940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t densityCount = densityGroups.size(); 6140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < densityCount; i++) { 6240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(densityGroups[i]); 6340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 6440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 6540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t abiCount = abiGroups.size(); 6640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < abiCount; i++) { 6740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(abiGroups[i]); 6840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 6940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski const size_t localeCount = localeGroups.size(); 7140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski for (size_t i = 0; i < localeCount; i++) { 7240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski groups.add(localeGroups[i]); 7340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski } 7440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski return groups; 7540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} 7640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski 7740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split 78