Hallo,
ich wollte eine App schreiben, die mit Plugins erweiterbar ist, konkret geht es in der App darum, dass man SMS von einem Web-Sms-Provider (bsp. smstrade.de) sendet und nicht über die Mobilfunkprovider.
Um nun die App einfach mit weiteren Web-SMS-Providern erweiterbar zu machen, wollte ich eine Art Plugins schreiben (die Plugins müssen nicht dynamisch in der App hinzugefügt werden können, sondern einfach zur Compilezeit zur Verfügung stehen)
Über ein Einstellungsmenü kann man den Provider aus der Liste wählen.
Für jeden Provider muss es aber außerdem noch ein eigenes Provider-Einstellungsmenü geben.
Nun habe ich das ganze So gelöst, dass ich im Einstellungsmenü aus einem StringArray die Provider wählen kann und anschließend wird mit String-Vergleichen überprüft, ob es einen solchen Provider gibt. Sollte es diesen geben, wird eine neue Instanz (mit dem Sender, empfänger und dem Text der Nachricht erzeugt)
private SenderPlugin getSenderClass() {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String sender = sharedPref.getString(KEY_PREF_SENDER, getString(R.string.pref_sender_default));
Log.d(DEBUG_TAG,sender);
if(sender.equals("SmsTrade")) {
return new SmsTrade(editMessage.getText().toString(),
editRecipient.getText().toString(),editSender.getText().toString(),
this);
} else {
return null;
}
}
Alles anzeigen
Nun brauche ich aber auch noch die Providerabhängige Settings-Klasse und zwar wirklich die Klasse, keine Instanz. Diese Settings-Klasse ist eine Inner-Class der ProviderKlasse. Aber hier muss ich wieder den gleichen Code schreiben, denn ich muss ja dann die Sender-Settings-Klasse über einen Intend starten:
//@TODO: this is not so good, because here we use the same things, as in getSenderClass
// so maybe there is a better way to do this.
private Class<?> getSenderSettingsClass() {
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String sender = sharedPref.getString(KEY_PREF_SENDER, getString(R.string.pref_sender_default));
Log.d(DEBUG_TAG,sender);
if(sender.equals("SmsTrade")) {
return SmsTrade.SettingsActivity.class;
} else {
return null;
}
}
private void showSenderSettings() {
Class<?> pluginSettings = getSenderSettingsClass();
Intent intent = new Intent(this, pluginSettings);
startActivity(intent);
}
Alles anzeigen
Nun habe ich aber in beiden Fällen fast den Gleichen Code.
Wie kann ich das ganze eleganter lösen, dass ich den Code mit den If-Abfragen, die die Senderklasse auswählen nur noch einmal habe? (Ich brauche einmal die Instanz der Basisklasse, das andere mal die Klasse der Kindklasse.)
falls etwas unklar ist, ich habe dieseApp auf Github veröffentlicht, hier kann man sich die Konkreten files ansehen.
https://github.com/mwuehrer/sms_sender
Konkret bezieht sich meine Frage somit auf die Dateien
https://github.com/mwuehrer/sm…_sender/MainActivity.java
https://github.com/mwuehrer/sm…nder/plugin/SmsTrade.java
ich weiß das ist etwas kompliziert geschrieben, aber ich weiß leider nicht, wie ich es anders formulieren soll.