cordova-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ross Gerbasi <rgerb...@gmail.com>
Subject Re: Android Plugin Resource Control
Date Thu, 02 Jan 2014 15:17:43 GMT
In your glass.xml example would you then advice a developer to edit
plugins/res/xml/glass.xml? I don't fully understand how plugman is going to
work with this setup. Would glass.xml be copied to
platforms/android/res/xml/glass every time you did a build? I am assuming
it will only be appended when you add the platform.

I am sorry for the "other users" confusion. I am not saying anything about
per user apps or multiple apps at all. When I say users i mean multiple
developers. If you have a team of 5 developers all working on an app
together and they are sharing the source code for your project. They all
need to be in sync with plugins and any config variables plugins will carry
with them. Ideally the plugins folder and the platforms folder would be
ignored from version control so that really leaves config.xml to hold these
variables. I still think we need some system in place for a plugin to get
variables from config.xml and apply them before every build.




On Thu, Jan 2, 2014 at 5:36 AM, Axel Nennker <ignisvulpis@gmail.com> wrote:

> you are right. The variable stuff is not working as I expected. Sorry for
> the confusion.
> I made another error because I thought that "<resource-file" was already
> available but it is not.
> I thought that
>
> <plugin ...>
>   <platform name="android" >
>     <resource-file src="glass.xml" dest="xml/glass.xml" />
>   </platform>
> </plugin>
>
> was available and that plugman would move glass.xml from to
> plugins/res/xml/glass.xml and then replace a variable inside glass.xml with
> a specified value. That way the value would stay in
> plugins/res/xml/glass.xml when you remove the platform. And then it would
> be moved to platforms/android/res/xml/glass.xml again when you re-add the
> platform.
>
> I appended this code to
>
> /usr/local/lib/node_modules/cordova/node_modules/plugman/src/platforms/android.js
>     "resource-file":{
>         install:function(el, plugin_dir, project_dir) {
>             var src = el.attrib.src;
>             var target = el.attrib.target;
>             var dest = path.join("res", target);
>             common.copyFile(plugin_dir, src, project_dir, dest);
>         },
>         uninstall:function(el, project_dir) {
>             var target = el.attrib.target;
>             var dest = path.join("res", target);
>             common.removeFile(project_dir, dest);
>         }
>     }
>
> Now the resource file "glass.xml" is copied to
> platforms/android/res/xml/glass.xml
>
> -Axel
>
> I still do not understand the "user" part of your last email because
> cordova is helping developers to build one app for many users. Everyone of
> your glass users gets the same app and if Glass lets not allow you to
> specify the listen command other than at build-time then you cannot change
> it without building a per-user app, right?
>
>
>
>
>
>
>
>
> 2014/1/1 Ross Gerbasi <rgerbasi@gmail.com>
>
> > Other users would be team members that are working on the project with
> you
> > via git or svn or something.
> >
> > Just to confirm if you run cordova platform remove android in your
> example
> > then run cordova platform add android again it applies the variable to
> the
> > new android project?
> >
> > So the whole thing would be
> >
> > cordova create GlassApp
> > cd GlassApp
> > cordova platform add android
> > cordova plugin add plugin_id --variable key=value
> > cordova platform remove android
> > cordova platform add android
> >
> > You see the variable applied in the new android project?
> >
> > If this does work like you say what would you then suggest if the user
> then
> > wants to change this value? They have to remove and re-add the plugin
> > again? it just seems like this should be in config.xml.
> >
> >
> >
> > On Wed, Jan 1, 2014 at 2:32 PM, Axel Nennker <ignisvulpis@gmail.com>
> > wrote:
> >
> > > I don't understand the "other users"-part.
> > >
> > > Not sure about the "mess" part. I looked at the plugman code and it
> looks
> > > ok.
> > > The plugin in <project_root>/plugins/glass_root has the modified
> resource
> > > files with "OK Glass" or whatever.
> > > It should not matter whether you add the plugin before or after the
> > > platform. Cordova takes the files from <project_root>/plugins and
> applies
> > > them to the platform files.
> > >
> > > My project layout is as this:
> > > <project_root>
> > > - src/plugins/glass_root
> > > - src/www
> > >
> > > This (src) is all that is in my source code repository. Now I have an
> ant
> > > script that creates the project, adds the platform and the plugins.
> > > cordova create GlassApp
> > > # and move src/www to www
> > > cordova platform add Android
> > > cordova plugin add plugin_id --variable key=value
> > >
> > > Afterwards the <project_root> looks like this (in addtion to the src
> > > dirctory)
> > > - www
> > > - plugins/plugin_id/res/values/glass.xml
> > > - platforms/android/...
> > >
> > > Now you can build the app and run it (for one "OK Glass" phrase). If
> you
> > > need a second/third phrase you need to uninstall the plugin and
> reinstall
> > > it with the new phrase. Did you mean this with "other users"?
> > >
> > >
> > >
> > >
> > >
> > >
> > > 2014/1/1 Ross Gerbasi <rgerbasi@gmail.com>
> > >
> > > > Variable was a mess. You can add a variable when you add a plugin so
> if
> > > you
> > > > worked this way all was ok
> > > >
> > > > -- create cordova project
> > > > -- add android platform
> > > > -- add plugin with variable
> > > >
> > > > but if you do it on a different order like
> > > >
> > > > -- create cordova project
> > > > -- add plugin with variable
> > > > -- add android platform
> > > >
> > > > Essentially if you removed your android project and re-add it after
> you
> > > > have the plugin, everything goes to hell.
> > > >
> > > > It doesn't work properly. It also isn't a good solution in the long
> run
> > > as
> > > > we are hoping in the future to ignore plugins and platforms from
> > version
> > > > control. If that happens we would then have a plugin manifest that
> > would
> > > > install plugins for other users. We would then have to store any
> > > variables
> > > > in this manifest so other users can get an "exact" copy, just seems
> > like
> > > a
> > > > whole bunch of headaches. Ideally this needs to be a config variable.
> > > >
> > > > hope this all makes sense :/
> > > >
> > > >
> > > > On Wed, Jan 1, 2014 at 11:52 AM, Axel Nennker <ignisvulpis@gmail.com
> >
> > > > wrote:
> > > >
> > > > > Didn't you solve this with --variable?
> > > > > I never used --variable myself.
> > > > > -Axel
> > > > > Am 01.01.2014 18:24 schrieb "Ross Gerbasi" <rgerbasi@gmail.com>:
> > > > >
> > > > > > That would work great if there was a way to set the property
I
> need
> > > at
> > > > > > runtime. Currently there does not seem to be a way to set the
app
> > > > launch
> > > > > > voice trigger string at runtime. Probably because Glass needs
> this
> > > > > trigger
> > > > > > before your application even launches. This trigger will show
up
> > in a
> > > > > menu
> > > > > > inside glass so it must be parsing my application to find this.
> > > > > >
> > > > > > This is why I need that variable set at build time, because
there
> > >  does
> > > > > not
> > > > > > seem to be a way, via code, to set this property.
> > > > > >
> > > > > > I am not sure if you can see this link without being a glass
> > explorer
> > > > but
> > > > > > here it goes anyway
> > > > > > https://developers.google.com/glass/develop/gdk/input/voice
> > > > > >
> > > > > >
> > > > > >
> > > > > > On Wed, Jan 1, 2014 at 11:18 AM, Axel Nennker <
> > ignisvulpis@gmail.com
> > > >
> > > > > > wrote:
> > > > > >
> > > > > > > I am not sure why you need to modify my_val at build time.
> Could
> > > you
> > > > > > please
> > > > > > > change your example so that you really need this at build
time?
> > > > > > >
> > > > > > > If you want a "product name displayed in your glass app
then
> you
> > > > could
> > > > > > use
> > > > > > > the <preference like in your example and fetch the value
from
> the
> > > > > > > activity's extras. All preferences from config.xml are
passed
> in
> > > into
> > > > > > your
> > > > > > > activity as extras. Just use getStringExtra("PRODUCT_NAME")
to
> > get
> > > it
> > > > > and
> > > > > > > use the value "foo" in your activity/plugin.
> > > > > > >
> > > > > > > With this you do not need the "variable" at build time
because
> > you
> > > > get
> > > > > it
> > > > > > > at run time.
> > > > > > >
> > > > > > > -Axel
> > > > > > >
> > > > > > > You get the extras in onNewIntent and in initialize.
> > > > > > >
> > > > > > >   @Override
> > > > > > >   public void onNewIntent(Intent intent) {
> > > > > > >     Log.d(TAG, "NewIntent " + getIntent());
> > > > > > >     Bundle extras = intent.getExtras();
> > > > > > >     if (extras != null && extras.size() > 0)
{
> > > > > > >       for (String key : extras.keySet()) {
> > > > > > >         Log.d(TAG, "KEY=" + key);
> > > > > > >       }
> > > > > > >     } else {
> > > > > > >       Log.d(TAG, "onNewIntent intent does NOT have extras");
> > > > > > >     }
> > > > > > >     ......
> > > > > > >  }
> > > > > > >
> > > > > > >
> > > > > > > public void initialize(CordovaInterface cordova, CordovaWebView
> > > > > webView)
> > > > > > {
> > > > > > >
> > > > > > >   Bundle extras = cordova.getIntent().getExtras();
> > > > > > >
> > > > > > > }
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > 2014/1/1 Ross Gerbasi <rgerbasi@gmail.com>
> > > > > > >
> > > > > > > > Alrighty I can get on board with the separate xml
file but I
> > was
> > > > not
> > > > > > > > concerned about the android build system parsing the
res
> file I
> > > am
> > > > > > > worried
> > > > > > > > about cordova setting the res file prior to building.
What
> > would
> > > be
> > > > > the
> > > > > > > > user workflow for this? Ideally it needs to be something
like
> > > > > > > >
> > > > > > > > - run add plugin
> > > > > > > > - add preference to config.xml
> > > > > > > > - run build android project
> > > > > > > > - CLI, prior to executing build, modifies RES file
with
> > > preference
> > > > > set
> > > > > > in
> > > > > > > > config.xml
> > > > > > > > - android project is built
> > > > > > > >
> > > > > > > > In order to do this we need some way of hooking into
the
> build
> > > > > process
> > > > > > > from
> > > > > > > > a plugin.
> > > > > > > >
> > > > > > > > I like Andrews idea of allowing a config file to load
a
> > variable
> > > we
> > > > > > would
> > > > > > > > also need a way to make this happen at build time
possible
> via
> > a
> > > > > > 'build'
> > > > > > > > flag? We could then check that resource, see if there
is a
> > > matching
> > > > > > > > element, if not add it. Something like this.
> > > > > > > >
> > > > > > > > plugin.xml
> > > > > > > > <config-file target="res/values/strings.xml" parent="/*"
> > > > > build="true">
> > > > > > > > <string name="my_val">{$PRODUCT_NAME}</string>
> > > > > > > > </config-file>
> > > > > > > >
> > > > > > > > config.xml:
> > > > > > > > <preference name="PRODUCT_NAME" value="foo" />
> > > > > > > >
> > > > > > > > Then you can combine this with Axels suggestion and
just
> change
> > > the
> > > > > > > target
> > > > > > > > of the config-file to glass.xml and add it as a resource
at
> > > plugin
> > > > > add.
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > On Wed, Jan 1, 2014 at 1:37 AM, Axel Nennker <
> > > > ignisvulpis@gmail.com>
> > > > > > > > wrote:
> > > > > > > >
> > > > > > > > > Every res file is parsed by the Android build
system at apk
> > > build
> > > > > > time.
> > > > > > > > > It is a good practice to group e.g. related string
> resources
> > in
> > > > > > > separate
> > > > > > > > > files instead of munching everything into strings.xml.
It
> > > doesn't
> > > > > > > matter
> > > > > > > > > whether this is a non-cordova Android project
or a cordova
> > > > plugin.
> > > > > > > > >
> > > > > > > > > Axel
> > > > > > > > > Am 31.12.2013 22:42 schrieb "Ross Gerbasi" <
> > rgerbasi@gmail.com
> > > >:
> > > > > > > > >
> > > > > > > > > > When would this happen though? Resources
seem to be
> applied
> > > > when
> > > > > > you
> > > > > > > > add
> > > > > > > > > a
> > > > > > > > > > plugin or when you add a platform and a
plugin already
> > > exists.
> > > > We
> > > > > > > need
> > > > > > > > to
> > > > > > > > > > allow the user a chance to edit this file.
Would this
> > > resource
> > > > be
> > > > > > > > copied
> > > > > > > > > > every build?
> > > > > > > > > >
> > > > > > > > > > The other issue I have with this is strings.xml
is pretty
> > > > > standard
> > > > > > > for
> > > > > > > > > any
> > > > > > > > > > text in your android application, it seems
a bit odd to
> > move
> > > > this
> > > > > > > > > > elsewhere.
> > > > > > > > > >
> > > > > > > > > > -ross
> > > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > On Tue, Dec 31, 2013 at 2:31 PM, Brian LeRoux
<
> b@brian.io>
> > > > > wrote:
> > > > > > > > > >
> > > > > > > > > > > That's clean
> > > > > > > > > > > On Dec 31, 2013 12:09 PM, "Axel Nennker"
<
> > > > > ignisvulpis@gmail.com>
> > > > > > > > > wrote:
> > > > > > > > > > >
> > > > > > > > > > > > I suggest to introduce e.g. <resource-file
> > > src="glass.xml"
> > > > > > > > > > > > target="/res/xml/glass.xml/>
for Android and other
> > > > platforms
> > > > > > that
> > > > > > > > > need
> > > > > > > > > > > it.
> > > > > > > > > > > > One platform already has it. Can't
remember which.
> > > > > > > > > > > > Plugman would then add/remove
that file.
> > > > > > > > > > > >
> > > > > > > > > > > > Axel
> > > > > > > > > > > > Am 31.12.2013 19:57 schrieb "Ross
Gerbasi" <
> > > > > rgerbasi@gmail.com
> > > > > > >:
> > > > > > > > > > > >
> > > > > > > > > > > > > Thats not a bad idea, would
we then inform the user
> > to
> > > > edit
> > > > > > the
> > > > > > > > > > > > plugin.xml
> > > > > > > > > > > > > after they add it? Remember
we need user to be able
> > to
> > > > > > > customize
> > > > > > > > > > > > > PRODUCT_NAME somehow.
> > > > > > > > > > > > >
> > > > > > > > > > > > > And editing strings.xml isn't
horrible it just
> breaks
> > > > > > > abstraction
> > > > > > > > > of
> > > > > > > > > > a
> > > > > > > > > > > > > plugin. So if you edit it,
then remove it it wont
> > > remove
> > > > > the
> > > > > > > > > entries
> > > > > > > > > > > you
> > > > > > > > > > > > > have modified. So when you
add it again you have 2
> > and
> > > > that
> > > > > > > > throws
> > > > > > > > > an
> > > > > > > > > > > > > android compile error.
> > > > > > > > > > > > >
> > > > > > > > > > > > > The other issue is with a
team working together. If
> > we
> > > do
> > > > > not
> > > > > > > > want
> > > > > > > > > > > people
> > > > > > > > > > > > > checking plugins & platforms
into source control
> then
> > > > other
> > > > > > > team
> > > > > > > > > > > members
> > > > > > > > > > > > > need to add all the plugins
themselves and they
> would
> > > > then
> > > > > > need
> > > > > > > > to
> > > > > > > > > > > modify
> > > > > > > > > > > > > the xml file in the same
way. Not major but again
> > just
> > > > > these
> > > > > > > > little
> > > > > > > > > > > > > branches that pop up. Would
be cool if we could
> > tighten
> > > > it
> > > > > up
> > > > > > > > with
> > > > > > > > > > some
> > > > > > > > > > > > > solution.
> > > > > > > > > > > > >
> > > > > > > > > > > > >
> > > > > > > > > > > > > On Tue, Dec 31, 2013 at 12:34
PM, Andrew Grieve <
> > > > > > > > > > agrieve@chromium.org
> > > > > > > > > > > > > >wrote:
> > > > > > > > > > > > >
> > > > > > > > > > > > > > Tough call on this one.
I'm a bit wary of letting
> > > > plugins
> > > > > > > > install
> > > > > > > > > > > > hooks,
> > > > > > > > > > > > > > because that power could
be abused.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > Maybe we could allow
variables to be used by
> > > > plugin.xml.
> > > > > > > E.g.:
> > > > > > > > > > > > > >    <config-file target="res/values/strings"
> > > > > > > parent="/*"><string
> > > > > > > > > > > > > >
> > name="my_val">{$PRODUCT_NAME}</string></config-file>
> > > > > > > > > > > > > > and in config.xml:
> > > > > > > > > > > > > >    <preference name="PRODUCT_NAME"
value="foo" />
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > That said, I don't think
it's that bad to tell
> > users
> > > to
> > > > > > edit
> > > > > > > > > their
> > > > > > > > > > > > > > strings.xml file.
> > > > > > > > > > > > > >
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > On Tue, Dec 31, 2013
at 11:50 AM, Ross Gerbasi <
> > > > > > > > > rgerbasi@gmail.com
> > > > > > > > > > >
> > > > > > > > > > > > > wrote:
> > > > > > > > > > > > > >
> > > > > > > > > > > > > > > Hello all,
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > I am trying to
work through the best solution
> to
> > > this
> > > > > > > problem
> > > > > > > > > > > figured
> > > > > > > > > > > > > it
> > > > > > > > > > > > > > > was smart to bring
it up to everyone here.
> Maybe
> > > > there
> > > > > > is a
> > > > > > > > way
> > > > > > > > > > to
> > > > > > > > > > > > > handle
> > > > > > > > > > > > > > > this but I haven't
come across it.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > This problem came
up in my Google Glass plugin
> > but
> > > I
> > > > am
> > > > > > > sure
> > > > > > > > > > other
> > > > > > > > > > > > > > plugins
> > > > > > > > > > > > > > > will need to handle
this also.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > In the strings.xml
resource we need to set a
> > "voice
> > > > > > > trigger"
> > > > > > > > > > > element
> > > > > > > > > > > > > > which
> > > > > > > > > > > > > > > is used to start
the app when you talk to
> glass.
> > > > There
> > > > > > > > doesn't
> > > > > > > > > > seem
> > > > > > > > > > > > to
> > > > > > > > > > > > > be
> > > > > > > > > > > > > > > any way to do this
with code and this string
> > would
> > > be
> > > > > > > > different
> > > > > > > > > > for
> > > > > > > > > > > > > ever
> > > > > > > > > > > > > > > app out there.
On top of that each voice
> trigger
> > > can
> > > > > > > > optionally
> > > > > > > > > > > have
> > > > > > > > > > > > > > > prompts that follow
it, to get more user input.
> > > > > > Currently I
> > > > > > > > > just
> > > > > > > > > > > > inform
> > > > > > > > > > > > > > the
> > > > > > > > > > > > > > > user via documentation
to go edit this xml file
> > > after
> > > > > > they
> > > > > > > > > > install
> > > > > > > > > > > > the
> > > > > > > > > > > > > > > plugin.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > This is not good
though because once they do
> that
> > > it
> > > > is
> > > > > > > > > unhooked
> > > > > > > > > > > from
> > > > > > > > > > > > > the
> > > > > > > > > > > > > > > plugin add/remove
workflow. if they remove the
> > > plugin
> > > > > > those
> > > > > > > > xml
> > > > > > > > > > > > > elements
> > > > > > > > > > > > > > > stay, and then
if they add the plugin back
> > > everything
> > > > > > > starts
> > > > > > > > to
> > > > > > > > > > > > become
> > > > > > > > > > > > > a
> > > > > > > > > > > > > > > mess.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > Essentially I need
a way to write to a xml
> > > resources
> > > > > > > before a
> > > > > > > > > > user
> > > > > > > > > > > > > does a
> > > > > > > > > > > > > > > build. I also need
to be able to access a
> config
> > > > file,
> > > > > > > > probably
> > > > > > > > > > > > > > config.xml,
> > > > > > > > > > > > > > > in order to get
the information to write to
> this
> > > > > > resource.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > I am thinking maybe
we allow plugins to have
> > hooks
> > > > > also?
> > > > > > So
> > > > > > > > > each
> > > > > > > > > > > > plugin
> > > > > > > > > > > > > > > could have a hooks
folder, which would then
> allow
> > > > every
> > > > > > > > plugin
> > > > > > > > > to
> > > > > > > > > > > run
> > > > > > > > > > > > > > > before build commands.
I could then open that
> > > > resource,
> > > > > > > grab
> > > > > > > > > the
> > > > > > > > > > > > > element
> > > > > > > > > > > > > > > and write the value
in there before every
> build.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > Plugins do offer
the ability to get variables
> > > during
> > > > > add
> > > > > > > with
> > > > > > > > > the
> > > > > > > > > > > > > > > --variable flag,
but i found this to be a huge
> > > mess.
> > > > > > > > Especially
> > > > > > > > > > > when
> > > > > > > > > > > > > > > dealing with plugins
that have dependent
> plugins
> > > that
> > > > > > need
> > > > > > > > > > > variables.
> > > > > > > > > > > > > It
> > > > > > > > > > > > > > > also is a problem
if you install the plugin
> then
> > > add
> > > > > > > platform
> > > > > > > > > > after
> > > > > > > > > > > > it
> > > > > > > > > > > > > > was
> > > > > > > > > > > > > > > looking for variables
at the wrong time. Anyway
> > > this
> > > > > > ended
> > > > > > > up
> > > > > > > > > > being
> > > > > > > > > > > > no
> > > > > > > > > > > > > > good
> > > > > > > > > > > > > > > for me.
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > I am all for any
suggestions, and I can dive
> into
> > > the
> > > > > CLI
> > > > > > > > code
> > > > > > > > > > and
> > > > > > > > > > > > try
> > > > > > > > > > > > > to
> > > > > > > > > > > > > > > hack together something
to get it working but I
> > > would
> > > > > > love
> > > > > > > to
> > > > > > > > > get
> > > > > > > > > > > > some
> > > > > > > > > > > > > > > direction. Any
ideas?
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > > > -ross
> > > > > > > > > > > > > > >
> > > > > > > > > > > > > >
> > > > > > > > > > > > >
> > > > > > > > > > > >
> > > > > > > > > > >
> > > > > > > > > >
> > > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message