/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.talkback.labeling; import android.text.TextUtils; import com.android.utils.labeling.Label; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class LabelSeparator { private List<Label> mImportedNewLabels = new ArrayList<>(); private List<Label> mImportedConflictLabels = new ArrayList<>(); private List<Label> mExistingConflictLabels = new ArrayList<>(); public LabelSeparator(List<Label> currentLabels, List<Label> newLabels) { separate(currentLabels, newLabels); } private void separate(List<Label> currentLabels, List<Label> importedLabels) { if (currentLabels == null || currentLabels.size() == 0) { if (importedLabels != null) { mImportedNewLabels.addAll(importedLabels); } return; } if (importedLabels == null || importedLabels.size() == 0) { return; } Map<LabelWrapper, Label> labelMap = getCurrentLabelMap(currentLabels); for (Label importedLabel : importedLabels) { if (importedLabel == null) { continue; } LabelWrapper wrapper = new LabelWrapper(importedLabel); Label existingLabel = labelMap.get(wrapper); if (existingLabel != null) { mExistingConflictLabels.add(existingLabel); mImportedConflictLabels.add(importedLabel); } else { mImportedNewLabels.add(importedLabel); } } } private Map<LabelWrapper, Label> getCurrentLabelMap(List<Label> currentLabels) { HashMap<LabelWrapper, Label> result = new HashMap<>(); if (currentLabels == null) { return result; } for (Label label : currentLabels) { if (label != null) { LabelWrapper wrapper = new LabelWrapper(label); result.put(wrapper, label); } } return result; } public List<Label> getImportedNewLabels() { return mImportedNewLabels; } public List<Label> getImportedConflictLabels() { return mImportedConflictLabels; } public List<Label> getExistingConflictLabels() { return mExistingConflictLabels; } /** * Wrapper class to have separate hashCode/equals logic for HashMap */ // reduced visibility for testing static class LabelWrapper { private Label mLabel; public LabelWrapper(Label label) { mLabel = label; } @Override public int hashCode() { int hash = 17; hash += mLabel.getPackageName() != null ? mLabel.getPackageName().hashCode() : 0; hash += 31*hash + mLabel.getPackageSignature() != null ? mLabel.getPackageSignature().hashCode() : 0; hash += 31*hash + mLabel.getViewName() != null ? mLabel.getViewName().hashCode() : 0; hash += 31*hash + mLabel.getLocale() != null ? mLabel.getLocale().hashCode() : 0; hash += 31*hash + mLabel.getPackageVersion(); return hash; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof LabelWrapper)) { return false; } LabelWrapper wrapper = (LabelWrapper) obj; return TextUtils.equals(mLabel.getPackageName(), wrapper.mLabel.getPackageName()) && TextUtils.equals(mLabel.getPackageSignature(), wrapper.mLabel.getPackageSignature()) && TextUtils.equals(mLabel.getViewName(), wrapper.mLabel.getViewName()) && TextUtils.equals(mLabel.getLocale(), wrapper.mLabel.getLocale()) && mLabel.getPackageVersion() == wrapper.mLabel.getPackageVersion(); } } }