]> git.tdb.fi Git - builder.git/blob - source/androidmanifestgenerator.cpp
Allow Android application permissions to be set in Build file
[builder.git] / source / androidmanifestgenerator.cpp
1 #include <msp/io/file.h>
2 #include <msp/io/print.h>
3 #include "androidmanifestfile.h"
4 #include "androidmanifestgenerator.h"
5 #include "component.h"
6 #include "sharedlibrary.h"
7 #include "sourcepackage.h"
8
9 using namespace std;
10 using namespace Msp;
11
12 AndroidManifestGenerator::AndroidManifestGenerator(Builder &b):
13         Tool(b, "AMG")
14 { }
15
16 Target *AndroidManifestGenerator::create_target(const list<Target *> &, const string &)
17 {
18         throw logic_error("not implemented");
19 }
20
21 Task *AndroidManifestGenerator::run(const Target &target) const
22 {
23         const AndroidManifestFile &manifest = dynamic_cast<const AndroidManifestFile &>(target);
24         Worker *worker = new Worker(manifest);
25         return new InternalTask(worker);
26 }
27
28
29 AndroidManifestGenerator::Worker::Worker(const AndroidManifestFile &m):
30         manifest(m)
31 { }
32
33 void AndroidManifestGenerator::Worker::main()
34 {
35         const Component &comp = *manifest.get_component();
36         const SourcePackage &pkg = comp.get_package();
37
38         IO::BufferedFile out(manifest.get_path().str(), IO::M_WRITE);
39         out.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
40         IO::print(out, "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"%s\">\n", comp.get_name());
41         out.write("\t<uses-sdk android:minSdkVersion=\"9\" />\n");
42         // TODO Make the icon name configurable
43         IO::print(out, "\t<application android:icon=\"@drawable/icon\" android:label=\"%s\" android:hasCode=\"false\">\n", pkg.get_label());
44         if(SharedLibrary *native_lib = manifest.get_native_library())
45         {
46                 out.write("\t\t<activity android:name=\"android.app.NativeActivity\">\n");
47                 IO::print(out, "\t\t\t<meta-data android:name=\"android.app.lib_name\" android:value=\"%s\" />\n", native_lib->get_libname());
48                 out.write("\t\t\t<intent-filter>\n");
49                 out.write("\t\t\t\t<action android:name=\"android.intent.action.MAIN\" />\n");
50                 out.write("\t\t\t\t<category android:name=\"android.intent.category.LAUNCHER\" />\n");
51                 out.write("\t\t\t</intent-filter>\n");
52                 out.write("\t\t</activity>\n");
53         }
54         out.write("\t</application>\n");
55         const set<string> &permissions = manifest.get_permissions();
56         for(set<string>::const_iterator i=permissions.begin(); i!=permissions.end(); ++i)
57                 IO::print(out, "\t<uses-permission android:name=\"%s\" />\n", *i);
58         out.write("</manifest>\n");
59
60         status = Task::SUCCESS;
61 }