/ app / src / main / java / com / reandroid / identifiers / TypeIdentifier.java
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  }