aboutsummaryrefslogtreecommitdiff
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java')
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java176
1 files changed, 176 insertions, 0 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java
new file mode 100644
index 000000000..e1819b283
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/project/SupportLibraryHelper.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
+ *
+ * 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.ide.eclipse.adt.internal.project;
+
+import static com.android.SdkConstants.FQCN_GRID_LAYOUT;
+import static com.android.SdkConstants.FQCN_GRID_LAYOUT_V7;
+import static com.android.SdkConstants.FQCN_SPACE;
+import static com.android.SdkConstants.FQCN_SPACE_V7;
+
+import com.android.annotations.NonNull;
+import com.android.annotations.Nullable;
+import com.android.ide.eclipse.adt.AdtUtils;
+import com.android.ide.eclipse.adt.internal.actions.AddSupportJarAction;
+import com.android.ide.eclipse.adt.internal.editors.manifest.ManifestInfo;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState;
+import com.android.ide.eclipse.adt.internal.sdk.ProjectState.LibraryState;
+import com.android.ide.eclipse.adt.internal.sdk.Sdk;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Helper class for the Android Support Library. The support library provides
+ * (for example) a backport of GridLayout, which must be used as a library
+ * project rather than a jar library since it has resources. This class provides
+ * support for finding the library project, or downloading and installing it on
+ * demand if it does not, as well as translating tags such as
+ * {@code <GridLayout>} into {@code <com.android.support.v7.GridLayout>} if it
+ * does not.
+ */
+public class SupportLibraryHelper {
+ /**
+ * Returns the correct tag to use for the given view tag. This is normally
+ * the same as the tag itself. However, for some views which are not available
+ * on all platforms, this will:
+ * <ul>
+ * <li> Check if the view is available in the compatibility library,
+ * and if so, if the support library is not installed, will offer to
+ * install it via the SDK manager.
+ * <li> (The tool may also offer to adjust the minimum SDK of the project
+ * up to a level such that the given tag is supported directly, and then
+ * this method will return the original tag.)
+ * <li> Check whether the compatibility library is included in the project, and
+ * if not, offer to copy it into the workspace and add a library dependency.
+ * <li> Return the alternative tag. For example, for "GridLayout", it will
+ * (if the minimum SDK is less than 14) return "com.android.support.v7.GridLayout"
+ * instead.
+ * </ul>
+ *
+ * @param project the project to add the dependency into
+ * @param tag the tag to look up, such as "GridLayout"
+ * @return the tag to use in the layout, normally the same as the input tag but possibly
+ * an equivalent compatibility library tag instead.
+ */
+ @NonNull
+ public static String getTagFor(@NonNull IProject project, @NonNull String tag) {
+ boolean isGridLayout = tag.equals(FQCN_GRID_LAYOUT);
+ boolean isSpace = tag.equals(FQCN_SPACE);
+ if (isGridLayout || isSpace) {
+ int minSdk = ManifestInfo.get(project).getMinSdkVersion();
+ if (minSdk < 14) {
+ // See if the support library is installed in the SDK area
+ // See if there is a local project in the workspace providing the
+ // project
+ IProject supportProject = getSupportProjectV7();
+ if (supportProject != null) {
+ // Make sure I have a dependency on it
+ ProjectState state = Sdk.getProjectState(project);
+ if (state != null) {
+ for (LibraryState library : state.getLibraries()) {
+ if (supportProject.equals(library.getProjectState().getProject())) {
+ // Found it: you have the compatibility library and have linked
+ // to it: use the alternative tag
+ return isGridLayout ? FQCN_GRID_LAYOUT_V7 : FQCN_SPACE_V7;
+ }
+ }
+ }
+ }
+
+ // Ask user to install it
+ String message = String.format(
+ "%1$s requires API level 14 or higher, or a compatibility "
+ + "library for older versions.\n\n"
+ + " Do you want to install the compatibility library?", tag);
+ MessageDialog dialog =
+ new MessageDialog(
+ Display.getCurrent().getActiveShell(),
+ "Warning",
+ null,
+ message,
+ MessageDialog.QUESTION,
+ new String[] {
+ "Install", "Cancel"
+ },
+ 1 /* default button: Cancel */);
+ int answer = dialog.open();
+ if (answer == 0) {
+ if (supportProject != null) {
+ // Just add library dependency
+ if (!AddSupportJarAction.addLibraryDependency(
+ supportProject,
+ project,
+ true /* waitForFinish */)) {
+ return tag;
+ }
+ } else {
+ // Install library AND add dependency
+ if (!AddSupportJarAction.installGridLayoutLibrary(
+ project,
+ true /* waitForFinish */)) {
+ return tag;
+ }
+ }
+
+ return isGridLayout ? FQCN_GRID_LAYOUT_V7 : FQCN_SPACE_V7;
+ }
+ }
+ }
+
+ return tag;
+ }
+
+ /** Cache for {@link #getSupportProjectV7()} */
+ private static IProject sCachedProject;
+
+ /**
+ * Finds and returns the support project in the workspace, if any.
+ *
+ * @return the android support library project, or null if not found
+ */
+ @Nullable
+ public static IProject getSupportProjectV7() {
+ if (sCachedProject != null) {
+ if (sCachedProject.isAccessible()) {
+ return sCachedProject;
+ } else {
+ sCachedProject = null;
+ }
+ }
+
+ sCachedProject = findSupportProjectV7();
+ return sCachedProject;
+ }
+
+ @Nullable
+ private static IProject findSupportProjectV7() {
+ for (IJavaProject javaProject : AdtUtils.getOpenAndroidProjects()) {
+ IProject project = javaProject.getProject();
+ ProjectState state = Sdk.getProjectState(project);
+ if (state != null && state.isLibrary()) {
+ ManifestInfo manifestInfo = ManifestInfo.get(project);
+ if (manifestInfo.getPackage().equals("android.support.v7.gridlayout")) { //$NON-NLS-1$
+ return project;
+ }
+ }
+ }
+
+ return null;
+ }
+}