CBA110
CBA110

Reputation: 1092

Android - Removing Activity from Flavor

How to remove an activity from an app flavor? Here is a simplified example, I have an app which has the following two flavors (Paid and Free). The app is small and only has 3 activities (MainActivity, ActivityOne and ActivityTwo). The paid app does not need any limitations since it will use the full code base. The free app however requires it to have MainActivity and ActivityTwo accessible to the user and not ActivityOne. How can I do a "Manifest Merge" when compiling the code so that ActivityOne is not present on the free version? In other words how should src/free/AndroidManifest.xml be created so that the free app does not have ActivityOne?

Below is the build.gradle file for the app:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.calculator"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
        paid {
            applicationId "com.example.paid"
            resValue "string", "app_name", "Paid Calculator"
            versionName "1.0-full"
        }
        free {
            applicationId "com.example.free"
            resValue "string", "app_name", "Free Calculator"
            versionName "1.0-free"
        }
    }
    sourceSets {
        paid {
            manifest.srcFile 'src/paid/AndroidManifest.xml'
        }
        free {
            manifest.srcFile 'src/free/AndroidManifest.xml'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:cardview-v7:21.0.0'
    compile 'com.android.support:recyclerview-v7:21.0.0'
    compile 'com.android.support:design:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
}

Below is the manifest file for the app It is located at src/main/AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.calculator">

    <application
        android:name="com.example.calculator.ui.activities.AppController"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ui.activities.MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.activities.ActivityOne"
            android:label="@string/title_activity_one"
            android:parentActivityName=".ui.activities.MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.activities.MainActivity" />
        </activity>
        <activity
            android:name=".ui.activities.ActivityTwo"
            android:label="@string/title_activity_two"
            android:parentActivityName=".ui.activities.MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.activities.MainActivity" />
        </activity>
    </application>
</manifest>

Upvotes: 10

Views: 4762

Answers (2)

anagaf
anagaf

Reputation: 2250

You can set android:enabled attribute with a placeholder

AndroidManifest.xml:

<activity 
    android:name=".ui.activities.ActivityOne" 
    android:enabled="${isPaidVersion}"/>

build.config:

defaultConfig {
  ...
  manifestPlaceholders = [isPaidVersion: "false"]
}

productFlavors {
    paid {
        ... 
        manifestPlaceholders = [isPaidVersion:"true"]
    }
    free {
        ...
    }
}

Upvotes: 12

Gabriele Mariotti
Gabriele Mariotti

Reputation: 364594

In your free flavor, in the AndroidManifest you can specify:

<activity android:name=".ui.activities.ActivityOne" tools:node="remove"/>

The marker tools:node="remove" will make the merger remove any activities with android:name=".ui.activities.ActivityOne"

Upvotes: 12

Related Questions