com.facebook.plugin.config.AndroidManifestConfigurator.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.plugin.config.AndroidManifestConfigurator.java

Source

/*
 * Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
 *
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
 * copy, modify, and distribute this software in source code or binary form for use
 * in connection with the web services and APIs provided by Facebook.
 *
 * As with any software that integrates with the Facebook platform, your use of
 * this software is subject to the Facebook Developer Principles and Policies
 * [http://developers.facebook.com/policy/]. This copyright notice shall be
 * included in all copies or substantial portions of the software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

package com.facebook.plugin.config;

import com.intellij.codeInsight.CodeInsightUtilCore;
import com.intellij.ide.actions.OpenFileAction;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.WritingAccessProvider;
import com.intellij.psi.PsiFile;
import com.intellij.psi.XmlElementFactory;
import com.intellij.psi.xml.XmlElement;
import com.intellij.psi.xml.XmlTag;
import org.jetbrains.android.dom.manifest.Activity;
import org.jetbrains.android.dom.manifest.Application;
import org.jetbrains.android.dom.manifest.Manifest;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class AndroidManifestConfigurator implements Configurator {

    private static final String METADATA_TAG = "<meta-data/>";
    private static final String PERMISSION_TAG = "<uses-permission/>";
    private static final String NAME_ATTR = "android:name";
    private static final String VALUE_ATTR = "android:value";

    private final Map<String, String> metadata;
    private final List<String> permissions;
    private final String activityName;

    AndroidManifestConfigurator(final String activityName) {
        this.activityName = activityName;
        this.metadata = new LinkedHashMap<>();
        this.permissions = new ArrayList<>();
    }

    AndroidManifestConfigurator addMetadata(final String name, final String value) {
        metadata.put(name, value);
        return this;
    }

    AndroidManifestConfigurator addPermission(final String permission) {
        permissions.add(permission);
        return this;
    }

    @Override
    public boolean isConfigured(final Module module) {
        final Manifest androidManifest = getAndroidManifest(module);
        if (androidManifest == null) {
            return false;
        }

        if (!androidManifest.getXmlElement().getText().contains(activityName)) {
            return false;
        }

        for (String metadataName : metadata.keySet()) {
            if (!androidManifest.getXmlElement().getText().contains(metadataName)) {
                return false;
            }
        }

        for (String permission : permissions) {
            if (!androidManifest.getXmlElement().getText().contains(permission)) {
                return false;
            }
        }

        return true;
    }

    @Override
    public void doConfigure(final Module module) {
        final Manifest androidManifest = getAndroidManifest(module);
        if ((androidManifest == null) || (androidManifest.getApplication() == null)
                || !WritingAccessProvider.isPotentiallyWritable(
                        androidManifest.getXmlElement().getContainingFile().getVirtualFile(), null)) {
            Messages.showErrorDialog(module.getProject(),
                    "Cannot find or modify Android manifest file for module " + module.getName(),
                    "Facebook SDK Plugin");
            return;
        }

        final PsiFile manifestFile = androidManifest.getXmlElement().getContainingFile();
        final Application application = androidManifest.getApplication();
        final XmlElement applicationTag = application.getXmlElement();
        final XmlElementFactory elementFactory = XmlElementFactory.getInstance(module.getProject());

        new WriteCommandAction(manifestFile.getProject()) {
            @Override
            protected void run(@NotNull Result result) {

                for (String permission : permissions) {
                    if (!androidManifest.getXmlElement().getText().contains(permission)) {
                        XmlTag permTag = elementFactory.createTagFromText(PERMISSION_TAG);
                        permTag.setAttribute(NAME_ATTR, permission);
                        androidManifest.getXmlElement().addBefore(permTag, applicationTag);
                    }
                }

                for (Map.Entry<String, String> metadata : metadata.entrySet()) {
                    if (!applicationTag.getText().contains(metadata.getKey())) {
                        XmlTag mdTag = elementFactory.createTagFromText(METADATA_TAG);
                        mdTag.setAttribute(NAME_ATTR, metadata.getKey());
                        mdTag.setAttribute(VALUE_ATTR, metadata.getValue());
                        application.getXmlElement().add(mdTag);
                    }
                }

                if (!applicationTag.getText().contains(activityName)) {
                    final Activity newActivity = application.addActivity();
                    newActivity.getActivityClass().setStringValue(activityName);
                }

                CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(manifestFile);
            }
        }.execute();

        OpenFileAction.openFile(manifestFile.getVirtualFile().getPath(), module.getProject());
    }

    private static Manifest getAndroidManifest(final Module module) {
        final AndroidFacet facet = AndroidFacet.getInstance(module);
        if (facet == null) {
            return null;
        }

        final Manifest manifest = facet.getManifest();
        if (manifest == null) {
            return null;
        }

        return manifest;
    }
}