Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android, Best way to provide app specific constants in a library project?

I am creating a library project for a number of android apps. The apps all have some common functionality that I wish to include in the library project but the library project functions require use of application specific constants

So I am looking for a way to provide the library functions with the names of the constants and allow each app to define them

An example of a specific app constant and how it is used within the library project

public class AppConstants {
    public static final long APP_ID = 6;//Needs to be set for each app
}

public static long getCurrentAppId(Context context) {
    return getLongPreference(context, CURRENT_APP_ID_KEY, AppConstants.APP_ID);
}

This is just one example of approximately 60 constants that need to be defined for each app for a large number of library functions

Obviously I would normally just import/include the project specific app_constants.java file but this is not possible in the library project files as it hasn't got a clue about the specific applications (rightly so)

So what is the best way to have each specific app override the constants?

Update I took a long time deciding on which of the superb answers I have been provided with best suited my needs (Thanks everyone) In the end I chose the xml solution. I don't particularly like it because it clutters up my apps resources and I did seriously consider using the interface solution but the xml solution does work nicely

like image 224
jamesc Avatar asked Mar 18 '12 19:03

jamesc


2 Answers

Option #1 Extend your AppConstants class in each project

Better Option#2 Use XML resources to define the constants

<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="integer" name="app_id" format="integer">6</item>
</resources>

then you can retrieve them by

Context.getResources().getInteger(R.integer.app_id);

add the xml file to your resources in each project with only the values you need different

like image 140
connoisseur Avatar answered Nov 15 '22 16:11

connoisseur


I don't know of a great schema to do that but it would certainly work this way:

define some base class in your library

// class, enum or whatever you want it to be. 
class BaseConstants {
    // use some real singleton instead
    public static final BaseConstants instance = new BaseConstants();

    // define those values - sadly static inheritance does not work
    private static final int APP_ID = 0;
    private static final int CURRENT_APP_ID_KEY = 24;

    // so we have to do that via methods
    protected int getAppId() {
        return APP_ID;
    }
    protected int getAppIdKey() {
        return CURRENT_APP_ID_KEY;
    }
}

let each Activity that wants something custom implement that

class App1Constants extends BaseConstants {
    public static final App1Constants instance = new App1Constants();

    private final static int APP_ID = 1;

    // want a different APP_ID here.
    protected int getAppId() {
        return APP_ID;
    }

    // getAppIdKey not implemented here, uses default
}

Use that class as context to the constants for your library

class Library {
    public static long getCurrentAppId(Context context, BaseConstants settings) {
        return getLongPreference(context, settings.getAppIdKey(), settings.getAppId());
    }
}

Activities would be like so

class myActivity extends Activity {
    // each Activity can implement it's own constants class and overwrite only some values
    private static final BaseConstants CONSTANTS = App1Constants.instance;

    private void whatever() {
        long appId = Library.getCurrentAppId(this, CONSTANTS);
    }
}

class myActivity2 extends Activity {
    // or could just use the default ones
    private static final BaseConstants CONSTANTS = BaseConstants.instance;

    private void whatever() {
        long appId = Library.getCurrentAppId(this, CONSTANTS);
    }
}

That schema is kind of ugly but it would work at least

like image 26
zapl Avatar answered Nov 15 '22 17:11

zapl