[ Startseite ]
[ EN | DE ]
Zeiterfassung: Public Services
Zeiterfassung bietet Services für Integration in andere Apps an (zum Beispiel "Tasker"),
sowie für Entwickler welche diese selber einbinden möchten.
Broadcast Receivers
com.dynamicg.timerecording.CHECK_IN
com.dynamicg.timerecording.CHECK_OUT
com.dynamicg.timerecording.PUNCH
com.dynamicg.timerecording.START_NEW_TASK
com.dynamicg.timerecording.DATA_EXPORT
com.dynamicg.timerecording.GET_INFO
Activity Aktionen
com.dynamicg.timerecording.activity.CHECK_IN
com.dynamicg.timerecording.activity.CHECK_OUT
com.dynamicg.timerecording.activity.PUNCH
com.dynamicg.timerecording.activity.SWITCH_TASK
→ Beachte: das sind "Action Strings", nicht Activity Klassennamen. Benutze folgendes falls zwingend die Activity angegeben werden muss:
Activity: com.dynamicg.timerecording.DispatcherFilteredActivity
Action: gemäss vorhergehender Liste
Activity Klassennamen
Alternativ, falls du "Activity Aktionen" nicht verwenden kannst, dann können folgende Klassen fürs Stempeln verwendet werden;
wir wollten diese ursprünglich mit einer früheren App-Version entfernen, aber einige Apps wie z.B. NFC ReTag akzeptieren nur dedizierte Klassennamen.
com.dynamicg.timerecording.PublicServices$CheckIn
com.dynamicg.timerecording.PublicServices$CheckOut
com.dynamicg.timerecording.PublicServices$Punch
App Package Namen
Beachte dass die Activity- und Broadcast-Namen identisch sind in beiden App-Versionen ("Free" und "Pro"); der App Package Name muss jeweils als Zusatzargument übergeben werden, konkret einer dieser Werte:
com.dynamicg.timerecording
com.dynamicg.timerecording.pro
Trivialer Broadcast-Test mit ADB
Das letzte Argument ist der App Package Name, d.h. "Free" beziehungsweise "Pro":
adb shell am broadcast -a com.dynamicg.timerecording.GET_INFO com.dynamicg.timerecording
adb shell am broadcast -a com.dynamicg.timerecording.GET_INFO com.dynamicg.timerecording.pro
Trivialer Activity-Test mit ADB
adb shell am start -n com.dynamicg.timerecording/com.dynamicg.timerecording.DispatcherFilteredActivity -a com.dynamicg.timerecording.activity.CHECK_IN
adb shell am start -n com.dynamicg.timerecording.pro/com.dynamicg.timerecording.DispatcherFilteredActivity -a com.dynamicg.timerecording.activity.CHECK_IN
Bestimmten Task fürs Stempeln setzen
• Setze das "com.dynamicg.timerecording.TASK" Extra. Wert ist die numerische Task-ID, welche auf dem "Task editieren" Schirm sichtbar ist.
• Alternativ: setze das "com.dynamicg.timerecording.TASK_NAME" Extra mit dem Task-Namen. Falls derselbe Task für mehrere Kunden existiert, dann benutze Format "taskname[[kundenname]]".
• Tasker Info: benutze dieses Format in Tasker: com.dynamicg.timerecording.TASK:{ID}
Bestimmte Zeit fürs Stempeln setzen
• Setze das "com.dynamicg.timerecording.TIME" Extra.
• Format ist "hh24:mm" (d.h. 00:00 bis 23:59).
• Um das Gültigkeitsdatum auf den nächsten Tag zu setzen: benutze Format "hh24:mm+1", z.B. "00:45+1"
Arbeitsnotiz fürs Stempeln setzen
• Setze das "com.dynamicg.timerecording.NOTES" Extra
GET_INFO
• Dies ist für Entwickler die Statusinformationen von Zeiterfassung in eigenen Apps oder Widgets integrieren möchten.
GET_INFO sendet aktuellen Task, laufendes Total, "Delta" und mehr an den definierten BroadcastReceiver.
• Beispielprojekt siehe hier: TimeRecInfoGetter-src.zip
• Der relevante Aufruf ist: com.dynamicg.timerecinfogetter.TimeRecDataGetter.getData()
• Alternativ stellt das "Tasker Plugin" der App die "GET_INFO_BROADCAST" Aktion zur Verfügung, welche alle GET_INFO Daten als "Key/Value Bundle" retourniert.
Die "Zeiterfassung Tasker Plugin" Konfigurationsseite zeigt mehr Informationen wenn diese Option selektiert wird.
DATA_EXPORT
Berichte können über einen Broadcast Intent erzeugt werden. Beispiel siehe unten.
Was ist “Check in” versus “Punch” versus “Start new task”
• “Check in” stempelt einmalig ein. Wiederholte Aufrufe weren ignoriert.
• “Punch” führt ein Einstempeln oder Ausstempeln aus, abhängig vom aktuellen Stempel-Zustand.
• “Start new task” startet eine neue Arbeitseinheit. Falls bereits eingestempelt, dann wird die bestehende Einheit mit "Ausstempeln" abgeschlossen.
App-Package-Erkennung
Die nachfolgenden Beispiele referenzieren die Variable "timeRecPkgName" als App-Packagenamen; diese kann entweder hartcodiert werden mit "com.dynamicg.timerecording" bzw. "com.dynamicg.timerecording.pro",
oder du kannst über den Android Package Manager die installierte App ableiten:
public static String getTimeRecPackage(Context context) {
final String pkgFree = "com.dynamicg.timerecording", pkgPro = "com.dynamicg.timerecording.pro";
// caution: these these packages need to be registered as "" in the Android app manifest (since Android 11)
try {
if (context.getPackageManager().getPackageInfo(pkgPro, PackageManager.GET_ACTIVITIES)!=null) {
return pkgPro;
}
} catch (NameNotFoundException e) {}
return pkgFree;
}
GET_TASKS
Das ist für Entwickler welche die Taskliste auslesen möchten. Siehe auch "Tasks Export/Import".
Intent intent = new Intent("com.dynamicg.timerecording.GET_TASKS");
intent.setPackage(timeRecPkgName);
BroadcastReceiver resultReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent resultIntent) {
Bundle extras = this.getResultExtras(true);
if (extras!=null) {
ArrayList taskIds = extras.getIntegerArrayList("com.dynamicg.timerecording.GET_TASKS.IDS");
String[] taskNames = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.NAMES");
String[] clientNames = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.CLIENTS");
String[] extra1 = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.EXTRA1");
String[] extra2 = extras.getStringArray("com.dynamicg.timerecording.GET_TASKS.EXTRA2");
boolean currentlyCheckedIn = extras.getBoolean("com.dynamicg.timerecording.GET_TASKS.STATE_CHECKED_IN");
int currentTaskId = extras.getInt("com.dynamicg.timerecording.GET_TASKS.STATE_TASK_ID");
}
}
};
context.sendOrderedBroadcast(intent, null, resultReceiver, null, Activity.RESULT_OK, null, null);
UPDATE_STAMP_VALUE
• Hiermit wird eines der "Werte" Felder aktualisiert
• Broadcast receiver: com.dynamicg.timerecording.SERVICE_DISPATCHER mit OPERATION=STAMP_VALUE_UPDATE
• Bundle-Werte: Key={VALUE_1|VALUE_2|VALUE_A|VALUE_B|VALUE_C|VALUE_D}, Value={der zu setzende Wert}
• Standardmässig wird die aktuelle Arbeitseinheit aktualisiert. Optionaler Bundle-Wert: Key=TIME, Value=Zeitstempel im Format hh24:mm derjenigen Arbeitseinheit die aktualisiert werden soll.
• Beispiel:
Intent intent = new Intent("com.dynamicg.timerecording.SERVICE_DISPATCHER");
intent.setPackage(timeRecPkgName);
intent.putExtra("OPERATION", "UPDATE_STAMP_VALUE");
intent.putExtra("VALUE_A", "TestA_"+new java.util.Date());
intent.putExtra("TIME", "08:46");
context.sendBroadcast(intent);
DATA_EXPORT Beispiel
final String dateFrom = "2017-08-01"; // format "yyyy-mm-yy"
final String dateTo = "2017-08-31"; // format "yyyy-mm-yy"
final String exportType = "e3"; // "e2" to "e10"
final String exportFormat = "html"; // values [html, xls, pdf, csv, xml]
Intent intent = new Intent("com.dynamicg.timerecording.DATA_EXPORT");
intent.setPackage(timeRecPkgName);
intent.putExtra("com.dynamicg.timerecording.DATE_FROM", dateFrom);
intent.putExtra("com.dynamicg.timerecording.DATE_TO", dateTo);
intent.putExtra("com.dynamicg.timerecording.EXPORT_TYPE", exportType);
intent.putExtra("com.dynamicg.timerecording.EXPORT_FORMAT", exportFormat);
// provide your package name so that TimeRec can grant the file uri:
intent.putExtra("com.dynamicg.timerecording.CALLED_BY_PKG", context.getPackageName());
// ALTERNATIVELY: PASS ALL PARAMS WITH ONE SINGLE "EXTRA"
//String exportData = dateFrom+","+dateTo+","+exportType+","+exportFormat;
//intent.putExtra("com.dynamicg.timerecording.EXPORT_DATA", exportData);
BroadcastReceiver resultReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent resultIntent) {
Bundle bundle = this.getResultExtras(true);
String uristring = bundle.getString("com.dynamicg.timerecording.FILE_URI");
android.net.Uri uri = android.net.Uri.parse(uristring);
Toast.makeText(context, "uri: "+uri.toString(), Toast.LENGTH_SHORT).show();
// content can be accessed via the uri's input stream, like so:
// InputStream is = context.getContentResolver().openInputStream(uri);
}
};
context.sendOrderedBroadcast(intent, null, resultReceiver, null, Activity.RESULT_OK, null, null);