com.android.tools.idea.rendering.DataBindingInfo.java Source code

Java tutorial

Introduction

Here is the source code for com.android.tools.idea.rendering.DataBindingInfo.java

Source

/*
 * 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.tools.idea.rendering;

import com.android.annotations.NonNull;
import com.android.ide.common.res2.DataBindingResourceType;
import com.android.ide.common.res2.ResourceItem;
import com.android.resources.ResourceType;
import com.android.tools.idea.databinding.DataBindingUtil;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.ModificationTracker;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlTag;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.Nullable;

import java.util.*;

/**
 * A data class that keeps data binding related information that was extracted from a layout file.
 */
public class DataBindingInfo implements ModificationTracker {
    private final Map<DataBindingResourceType, List<PsiDataBindingResourceItem>> myItems = Maps
            .newEnumMap(DataBindingResourceType.class);

    private String myClassName;
    private String myPackageName;
    private final PsiResourceFile myPsiResourceFile;
    private PsiClass myPsiClass;
    private long myModificationCount;
    private final AndroidFacet myFacet;

    public DataBindingInfo(AndroidFacet facet, PsiResourceFile psiResourceFile, String className,
            String packageName) {
        myFacet = facet;
        myClassName = className;
        myPackageName = packageName;
        myPsiResourceFile = psiResourceFile;
    }

    public AndroidFacet getFacet() {
        return myFacet;
    }

    void update(String className, String packageName, long modificationCount) {
        if (StringUtil.equals(myClassName, className) && StringUtil.equals(myPackageName, packageName)) {
            return;
        }
        this.myClassName = className;
        this.myPackageName = packageName;
        myModificationCount = modificationCount;
    }

    private boolean addItem(PsiDataBindingResourceItem item) {
        List<PsiDataBindingResourceItem> items = myItems.get(item.getType());
        if (items == null) {
            items = Lists.newArrayList();
            myItems.put(item.getType(), items);
        }
        boolean newItem = !items.contains(item);
        if (newItem) {
            items.add(item);
        }
        return newItem;
    }

    public void replaceItems(@NonNull Iterable<PsiDataBindingResourceItem> items, long modificationCount) {
        boolean changed = myItems == null;
        if (myItems == null) {
            changed = true;
        } else {
            List<PsiDataBindingResourceItem> removed = Lists.newArrayList();
            for (Map.Entry<DataBindingResourceType, List<PsiDataBindingResourceItem>> entry : myItems.entrySet()) {
                for (PsiDataBindingResourceItem item : entry.getValue()) {
                    if (!Iterables.contains(items, item)) {
                        removed.add(item);
                    }
                }
                changed |= removed.size() > 0;
                for (PsiDataBindingResourceItem item : removed) {
                    entry.getValue().remove(item);
                }
            }
            for (PsiDataBindingResourceItem item : items) {
                changed = addItem(item) | changed;
            }
        }
        if (changed) {
            myModificationCount = modificationCount;
        }
    }

    public String getClassName() {
        return myClassName;
    }

    public String getPackageName() {
        return myPackageName;
    }

    public Project getProject() {
        return myPsiResourceFile.getPsiFile().getProject();
    }

    public String getQualifiedName() {
        return myPackageName + "." + myClassName;
    }

    public PsiElement getNavigationElement() {
        return myPsiResourceFile.getPsiFile();
    }

    public PsiFile getPsiFile() {
        return myPsiResourceFile.getPsiFile();
    }

    public PsiClass getPsiClass() {
        return myPsiClass;
    }

    public void setPsiClass(PsiClass psiClass) {
        myPsiClass = psiClass;
    }

    public List<PsiDataBindingResourceItem> getItems(DataBindingResourceType type) {
        return myItems.get(type);
    }

    public List<ViewWithId> getViewsWithIds() {
        Collection<ResourceItem> resourceItems = myPsiResourceFile.getItems();
        List<ViewWithId> result = Lists.newArrayList();
        for (ResourceItem item : resourceItems) {
            if (!ResourceType.ID.equals(item.getType())) {
                continue;
            }
            if (!(item instanceof PsiResourceItem)) {
                continue;
            }
            PsiResourceItem psiResourceItem = (PsiResourceItem) item;
            if (psiResourceItem.getTag() == null) {
                continue;
            }
            result.add(new ViewWithId(DataBindingUtil.convertToJavaFieldName(item.getName()),
                    psiResourceItem.getTag()));
        }
        return result;
    }

    @Nullable
    public Module getModule() {
        return ModuleUtilCore.findModuleForPsiElement(myPsiResourceFile.getPsiFile());
    }

    @Override
    public long getModificationCount() {
        return myModificationCount;
    }

    public static class ViewWithId {
        public final String name;
        public final XmlTag tag;

        public ViewWithId(String name, XmlTag tag) {
            this.name = name;
            this.tag = tag;
        }
    }
}