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;
37c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    const size_t splitCount = splits.size();
38c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski    for (size_t i = 0; i < splitCount; i++) {
39c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        const SplitDescription& split = splits[i];
4040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski        if (split.config.density != 0) {
4140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            SplitDescription key(split);
4240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            key.config.density = 0;
4340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            key.config.sdkVersion = 0; // Ignore density so we can support anydpi.
44c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski            appendValue(densityGroups, key, split);
45c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski        } else if (split.abi != abi::Variant_none) {
4640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            SplitDescription key(split);
47c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski            key.abi = abi::Variant_none;
48c3dc0b57b8d0b3875f868788e110aa67fb032b4aAdam Lesinski            appendValue(abiGroups, key, split);
4940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski        } else {
5040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            groups.add();
5140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski            groups.editTop().add(split);
5240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski        }
5340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    }
5440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
5540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    const size_t densityCount = densityGroups.size();
5640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    for (size_t i = 0; i < densityCount; i++) {
5740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski        groups.add(densityGroups[i]);
5840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    }
5940e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
6040e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    const size_t abiCount = abiGroups.size();
6140e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    for (size_t i = 0; i < abiCount; i++) {
6240e8eefbedcafc51948945647d746daaee092f16Adam Lesinski        groups.add(abiGroups[i]);
6340e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    }
6440e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
6540e8eefbedcafc51948945647d746daaee092f16Adam Lesinski    return groups;
6640e8eefbedcafc51948945647d746daaee092f16Adam Lesinski}
6740e8eefbedcafc51948945647d746daaee092f16Adam Lesinski
6840e8eefbedcafc51948945647d746daaee092f16Adam Lesinski} // namespace split
69