TypeIdentifier.java
1 /* 2 * Copyright (C) 2022 github.com/REAndroid 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.reandroid.identifiers; 17 18 import org.xmlpull.v1.XmlSerializer; 19 20 import java.io.IOException; 21 import java.util.ArrayList; 22 import java.util.HashMap; 23 import java.util.List; 24 import java.util.Map; 25 26 public class TypeIdentifier extends IdentifierMap<ResourceIdentifier> { 27 private final Map<Object, ResourceIdentifier> tagMap; 28 public TypeIdentifier(int id, String name){ 29 super(id, name); 30 this.tagMap = new HashMap<>(); 31 } 32 public TypeIdentifier(){ 33 this(0, null); 34 } 35 36 37 public List<ResourceIdentifier> ensureUniqueResourceNames(){ 38 List<ResourceIdentifier> results = new ArrayList<>(); 39 for(ResourceIdentifier ri : listDuplicates()){ 40 String name = ri.generateUniqueName(); 41 ri.setName(name); 42 results.add(ri); 43 } 44 if(results.size() > 0){ 45 reloadNameMap(); 46 } 47 return results; 48 } 49 50 public void write(XmlSerializer serializer) throws IOException { 51 for(ResourceIdentifier resourceIdentifier : list()){ 52 resourceIdentifier.write(serializer); 53 } 54 } 55 public PackageIdentifier getPackageIdentifier() { 56 return (PackageIdentifier) getParent(); 57 } 58 public void setPackageIdentifier(PackageIdentifier packageIdentifier) { 59 setParent(packageIdentifier); 60 } 61 public String getPackageName(){ 62 PackageIdentifier packageIdentifier = getPackageIdentifier(); 63 if(packageIdentifier != null){ 64 return packageIdentifier.getName(); 65 } 66 return null; 67 } 68 public int getPackageId(){ 69 PackageIdentifier packageIdentifier = getPackageIdentifier(); 70 if(packageIdentifier != null){ 71 return packageIdentifier.getId(); 72 } 73 return 0; 74 } 75 76 public int renameSpecs(){ 77 int result = 0; 78 for(ResourceIdentifier ri : getItems()){ 79 boolean renamed = ri.renameSpec(); 80 if(renamed){ 81 result++; 82 } 83 } 84 if(result != 0){ 85 reloadNameMap(); 86 } 87 return result; 88 } 89 public int renameDuplicateSpecs(){ 90 int result = 0; 91 for(ResourceIdentifier ri : listDuplicates()){ 92 boolean renamed = ri.renameSpecGenerated(); 93 if(renamed){ 94 result++; 95 } 96 } 97 if(result != 0){ 98 reloadNameMap(); 99 } 100 return result; 101 } 102 public int renameBadSpecs(){ 103 int result = 0; 104 for(ResourceIdentifier ri : getItems()){ 105 boolean renamed = ri.renameBadSpec(); 106 if(renamed){ 107 result++; 108 } 109 } 110 if(result != 0){ 111 reloadNameMap(); 112 } 113 return result; 114 } 115 116 @Override 117 public ResourceIdentifier getByTag(Object tag){ 118 ResourceIdentifier ri = this.tagMap.get(tag); 119 if(ri != null){ 120 return ri; 121 } 122 return super.getByTag(tag); 123 } 124 @Override 125 public void clear(){ 126 tagMap.clear(); 127 super.clear(); 128 } 129 @Override 130 long getUniqueId(){ 131 int uniqueId = getPackageId() << 8; 132 uniqueId |= getId(); 133 return uniqueId; 134 } 135 void addTag(Object tag, ResourceIdentifier ri){ 136 if(tag != null){ 137 tagMap.put(tag, ri); 138 } 139 } 140 void removeTag(Object tag){ 141 tagMap.remove(tag); 142 } 143 144 }