com.android.tools.idea.updater.configure.SummaryTreeNode.java Source code

Java tutorial

Introduction

Here is the source code for com.android.tools.idea.updater.configure.SummaryTreeNode.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.updater.configure;

import com.android.repository.impl.meta.TypeDetails;
import com.android.sdklib.AndroidVersion;
import com.android.sdklib.SdkVersionInfo;
import com.android.sdklib.repository.meta.DetailsTypes;
import com.google.common.collect.Sets;

import javax.swing.*;
import java.util.Set;

/**
 * Tree node representing all packages corresponding to a specified AndroidVersion. The checked state and the effect of
 * checking/unchecking this node is taken from and applies to children where {@code includeInSummary()} is true. The revision
 * number will be taken from a child where {@code isPrimary()} is true.
 */
class SummaryTreeNode extends UpdaterTreeNode {
    private AndroidVersion myVersion;
    private Set<UpdaterTreeNode> myAllChildren;
    private Set<UpdaterTreeNode> myIncludedChildren = Sets.newHashSet();
    private UpdaterTreeNode myPrimaryChild;

    /**
     * Factory method to create SummaryTreeNodes.
     *
     * @param version The AndroidVersion of this node
     * @param children The nodes represented by this summary node.
     * @param versionName The version name to be shown in the UI.
     * @return A new SummaryTreeNode, or null if none of the children are actually included.
     */
    public static SummaryTreeNode createNode(AndroidVersion version, Set<UpdaterTreeNode> children) {
        Set<UpdaterTreeNode> includedChildren = Sets.newHashSet();
        UpdaterTreeNode primaryChild = null;
        for (UpdaterTreeNode child : children) {
            if (child.includeInSummary()) {
                includedChildren.add(child);
            }
            if (child.isPrimary()) {
                primaryChild = child;
            }
        }

        if (!includedChildren.isEmpty()) {
            return new SummaryTreeNode(version, children, includedChildren, primaryChild);
        }
        return null;
    }

    protected SummaryTreeNode(AndroidVersion version, Set<UpdaterTreeNode> children,
            Set<UpdaterTreeNode> includedChildren, UpdaterTreeNode primaryChild) {
        myVersion = version;
        myAllChildren = children;
        myIncludedChildren = includedChildren;
        myPrimaryChild = primaryChild;
    }

    @Override
    public PackageNodeModel.SelectedState getInitialState() {
        boolean hasNeedsUpdate = false;
        for (UpdaterTreeNode summaryNode : myIncludedChildren) {
            if (summaryNode.getInitialState() == PackageNodeModel.SelectedState.NOT_INSTALLED) {
                return PackageNodeModel.SelectedState.NOT_INSTALLED;
            }
            if (summaryNode.getInitialState() == PackageNodeModel.SelectedState.MIXED) {
                hasNeedsUpdate = true;
            }
        }
        return hasNeedsUpdate ? PackageNodeModel.SelectedState.MIXED : PackageNodeModel.SelectedState.INSTALLED;
    }

    @Override
    public PackageNodeModel.SelectedState getCurrentState() {
        boolean hasNeedsUpdate = false;
        for (UpdaterTreeNode summaryNode : myIncludedChildren) {
            if (summaryNode.getCurrentState() == PackageNodeModel.SelectedState.NOT_INSTALLED) {
                return PackageNodeModel.SelectedState.NOT_INSTALLED;
            }
            if (summaryNode.getCurrentState() == PackageNodeModel.SelectedState.MIXED) {
                hasNeedsUpdate = true;
            }
        }
        return hasNeedsUpdate ? PackageNodeModel.SelectedState.MIXED : PackageNodeModel.SelectedState.INSTALLED;
    }

    @Override
    public int compareTo(UpdaterTreeNode o) {
        if (!(o instanceof SummaryTreeNode)) {
            return super.compareTo(o);
        }
        return myVersion.compareTo(((SummaryTreeNode) o).myVersion);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof SummaryTreeNode)) {
            return false;
        }
        return myVersion.equals(((SummaryTreeNode) obj).myVersion);
    }

    @Override
    public void customizeRenderer(Renderer renderer, JTree tree, boolean selected, boolean expanded, boolean leaf,
            int row, boolean hasFocus) {
        renderer.getTextRenderer().append(SdkVersionInfo.getVersionWithCodename(myVersion));
    }

    public AndroidVersion getVersion() {
        return myVersion;
    }

    @Override
    protected void setState(PackageNodeModel.SelectedState state) {
        boolean hasOrigNotInstalled = false;
        for (UpdaterTreeNode summaryTreeNode : myIncludedChildren) {
            if (summaryTreeNode.getInitialState() == PackageNodeModel.SelectedState.NOT_INSTALLED) {
                hasOrigNotInstalled = true;
            }
        }

        // In most cases setting the summary resets all packages to their initial state.
        // In the mixed case, we know this is all we need to do.
        for (UpdaterTreeNode child : myAllChildren) {
            child.resetState();
        }

        if (state == PackageNodeModel.SelectedState.NOT_INSTALLED) {
            if (!hasOrigNotInstalled) {
                // We originally were completely installed, so remove all packages to uninstall.
                for (UpdaterTreeNode child : myAllChildren) {
                    child.setState(PackageNodeModel.SelectedState.NOT_INSTALLED);
                }
            }
        }
        if (state == PackageNodeModel.SelectedState.INSTALLED) {
            // install included packages
            for (UpdaterTreeNode child : myIncludedChildren) {
                child.setState(PackageNodeModel.SelectedState.INSTALLED);
            }
        }
    }

    @Override
    protected boolean canHaveMixedState() {
        for (UpdaterTreeNode child : myIncludedChildren) {
            if (child.canHaveMixedState()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public String getStatusString() {
        boolean foundSources = false;
        boolean foundPlatform = false;
        boolean foundUpdate = false;
        for (UpdaterTreeNode child : myAllChildren) {
            if (child.getInitialState() != PackageNodeModel.SelectedState.NOT_INSTALLED) {
                TypeDetails details = ((DetailsTreeNode) child).getPackage().getTypeDetails();
                if (details instanceof DetailsTypes.SourceDetailsType) {
                    foundSources = true;
                } else if (details instanceof DetailsTypes.PlatformDetailsType) {
                    foundPlatform = true;
                }
                if (child.getInitialState() == PackageNodeModel.SelectedState.MIXED) {
                    foundUpdate = true;
                }
            }
        }
        if (foundUpdate) {
            return "Update available";
        }
        if (foundPlatform && (foundSources || myVersion.getApiLevel() < 14)) {
            // APIs before 14 don't have separate sources
            return "Installed";
        }
        if (foundPlatform || foundSources) {
            return "Partially installed";
        }
        return "Not installed";
    }

    public UpdaterTreeNode getPrimaryChild() {
        return myPrimaryChild;
    }
}