diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/TidepoolUploaded.java.txt b/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/TidepoolUploaded.java.txt deleted file mode 100644 index 9cef0e726f..0000000000 --- a/app/src/main/java/info/nightscout/androidaps/plugins/general/tidepool/TidepoolUploaded.java.txt +++ /dev/null @@ -1,346 +0,0 @@ -package com.eveningoutpost.dexdrip.tidepool; - -import android.os.PowerManager; -import android.util.Log; - -import java.util.List; - -import info.nightscout.androidaps.BuildConfig; -import info.nightscout.androidaps.R; -import info.nightscout.androidaps.plugins.general.tidepool.comm.InfoInterceptor; -import info.nightscout.androidaps.plugins.general.tidepool.comm.Session; -import info.nightscout.androidaps.plugins.general.tidepool.comm.TidepoolCallback; -import info.nightscout.androidaps.plugins.general.tidepool.messages.AuthReplyMessage; -import info.nightscout.androidaps.plugins.general.tidepool.messages.AuthRequestMessage; -import info.nightscout.androidaps.plugins.general.tidepool.messages.DatasetReplyMessage; -import info.nightscout.androidaps.plugins.general.tidepool.messages.OpenDatasetRequestMessage; -import info.nightscout.androidaps.plugins.general.tidepool.messages.UploadReplyMessage; -import info.nightscout.androidaps.utils.SP; -import okhttp3.MediaType; -import okhttp3.OkHttpClient; -import okhttp3.RequestBody; -import okhttp3.logging.HttpLoggingInterceptor; -import retrofit2.Call; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -import retrofit2.http.Body; -import retrofit2.http.DELETE; -import retrofit2.http.GET; -import retrofit2.http.Header; -import retrofit2.http.Headers; -import retrofit2.http.POST; -import retrofit2.http.PUT; -import retrofit2.http.Path; -import retrofit2.http.Query; - -/** - * jamorham - *

- * Tidepool Uploader - *

- * huge thanks to bassettb for a working c# reference implementation upon which this is based - */ - -public class TidepoolUploader { - - protected static final String TAG = "TidepoolUploader"; - protected static final String STATUS_KEY = "Tidepool-Status"; - private static final boolean D = true; - private static final boolean REPEAT = false; - - private static Retrofit retrofit; - private static final String INTEGRATION_BASE_URL = "https://int-api.tidepool.org"; - private static final String PRODUCTION_BASE_URL = "https://api.tidepool.org"; - private static final String SESSION_TOKEN_HEADER = "x-tidepool-session-token"; - - private static PowerManager.WakeLock wl; - - public interface Tidepool { - @Headers({ - "User-Agent: AAPS- " + BuildConfig.VERSION_NAME, - "X-Tidepool-Client-Name: " + BuildConfig.APPLICATION_ID, - "X-Tidepool-Client-Version: 0.1.0", // TODO: const it - }) - - @POST("/auth/login") - Call getLogin(@Header("Authorization") String secret); - - @DELETE("/v1/users/{userId}/data") - Call deleteAllData(@Header(SESSION_TOKEN_HEADER) String token, @Path("userId") String id); - - @DELETE("/v1/datasets/{dataSetId}") - Call deleteDataSet(@Header(SESSION_TOKEN_HEADER) String token, @Path("dataSetId") String id); - - @GET("/v1/users/{userId}/data_sets") - Call> getOpenDataSets(@Header(SESSION_TOKEN_HEADER) String token, - @Path("userId") String id, - @Query("client.name") String clientName, - @Query("size") int size); - - @GET("/v1/datasets/{dataSetId}") - Call getDataSet(@Header(SESSION_TOKEN_HEADER) String token, @Path("dataSetId") String id); - - @POST("/v1/users/{userId}/data_sets") - Call openDataSet(@Header(SESSION_TOKEN_HEADER) String token, @Path("userId") String id, @Body RequestBody body); - - @POST("/v1/datasets/{sessionId}/data") - Call doUpload(@Header(SESSION_TOKEN_HEADER) String token, @Path("sessionId") String id, @Body RequestBody body); - - @PUT("/v1/datasets/{sessionId}") - Call closeDataSet(@Header(SESSION_TOKEN_HEADER) String token, @Path("sessionId") String id, @Body RequestBody body); - - } - - - public static Retrofit getRetrofitInstance() { - if (retrofit == null) { - - final HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); - if (D) { - httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); - } - final OkHttpClient client = new OkHttpClient.Builder() - .addInterceptor(httpLoggingInterceptor) - .addInterceptor(new InfoInterceptor(TAG)) - // .addInterceptor(new GzipRequestInterceptor()) - .build(); - - retrofit = new Retrofit.Builder() - .baseUrl(SP.getBoolean(R.string.key_tidepool_dev_servers, false) ? INTEGRATION_BASE_URL : PRODUCTION_BASE_URL) - .client(client) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - } - return retrofit; - } - - public static void resetInstance() { - retrofit = null; - Log.d(TAG, "Instance reset"); - } - - public static void doLoginFromUi() { - doLogin(true); - } - - public static synchronized void doLogin(final boolean fromUi) { - if (!TidepoolEntry.enabled()) { - Log.d(TAG, "Cannot login as disabled by preference"); - if (fromUi) { -// JoH.static_toast_long("Cannot login as Tidepool feature not enabled"); - } - return; - } - // TODO failure backoff -// if (JoH.ratelimit("tidepool-login", 10)) { - extendWakeLock(30000); - final Session session = new Session(MAuthRequest.getAuthRequestHeader(), SESSION_TOKEN_HEADER); - if (session.authHeader() != null) { - final Call call = session.service().getLogin(session.authHeader()); - status("Connecting"); - if (fromUi) { -// JoH.static_toast_long("Connecting to Tidepool"); - } - - call.enqueue(new TidepoolCallback(session, "Login", () -> startSession(session, fromUi)) - .setOnFailure(() -> loginFailed(fromUi))); - } else { - Log.e(TAG, "Cannot do login as user credentials have not been set correctly"); - status("Invalid credentials"); - if (fromUi) { -// JoH.static_toast_long("Cannot login as Tidepool credentials have not been set correctly"); - } - releaseWakeLock(); - } - // } - } - - private static void loginFailed(boolean fromUi) { - if (fromUi) { -// JoH.static_toast_long("Login failed - see event log for details"); - } - releaseWakeLock(); - } - - public static void testLogin(Context rootContext) { - if (JoH.ratelimit("tidepool-login", 1)) { - - String message = "Failed to log into Tidepool.\n" + - "Check that your user name and password are correct."; - - final Session session = new Session(MAuthRequest.getAuthRequestHeader(), SESSION_TOKEN_HEADER); - if (session.authHeader != null) { - final Call call = session.service.getLogin(session.authHeader); - - try { - Response response = call.execute(); - UserError.Log.e(TAG, "Header: " + response.code()); - message = "Successfully logged into Tidepool."; - } catch (IOException e) { - e.printStackTrace(); - } - } else { - UserError.Log.e(TAG, "Cannot do login as user credentials have not been set correctly"); - } - - AlertDialog.Builder builder = new AlertDialog.Builder(rootContext); - - builder.setTitle("Tidepool Login"); - - builder.setMessage(message); - - builder.setPositiveButton("OK", (dialog, id) -> { - dialog.dismiss(); - }); - - final AlertDialog alert = builder.create(); - alert.show(); - } - } - - - private static void startSession(final Session session, boolean fromUi) { -// if (JoH.ratelimit("tidepool-start-session", 60)) { - extendWakeLock(30000); - if (session.authReply.userid != null) { - // See if we already have an open data set to write to - Call> datasetCall = session.service.getOpenDataSets(session.token, - session.authReply.userid, BuildConfig.APPLICATION_ID, 1); - - datasetCall.enqueue(new TidepoolCallback>(session, "Get Open Datasets", () -> { - if (session.datasetReply == null) { - status("New data set"); - if (fromUi) { -// JoH.static_toast_long("Creating new data set"); - } - Call call = session.service.openDataSet(session.token, session.authReply.userid, new MOpenDatasetRequest().getBody()); - call.enqueue(new TidepoolCallback(session, "Open New Dataset", () -> doUpload(session)) - .setOnFailure(TidepoolUploader::releaseWakeLock)); - } else { - Log.d(TAG, "Existing Dataset: " + session.datasetReply.getUploadId()); - // TODO: Wouldn't need to do this if we could block on the above `call.enqueue`. - // ie, do the openDataSet conditionally, and then do `doUpload` either way. - status("Appending"); - if (fromUi) { -// JoH.static_toast_long("Found existing remote data set"); - } - doUpload(session); - } - }).setOnFailure(TidepoolUploader::releaseWakeLock)); - } else { - Log.wtf(TAG, "Got login response but cannot determine userid - cannot proceed"); - if (fromUi) { -// JoH.static_toast_long("Error: Cannot determine userid"); - } - status("Error userid"); - releaseWakeLock(); - } -// } else { -// status("Cool Down Wait"); -// if (fromUi) { -// JoH.static_toast_long("In cool down period, please wait 1 minute"); -// } -// } - } - - - private static void doUpload(final Session session) { - if (!TidepoolEntry.enabled()) { - Log.e(TAG, "Cannot upload - preference disabled"); - return; - } - extendWakeLock(60000); - session.iterations++; - final String chunk = UploadChunk.getNext(session); - if (chunk != null) { - if (chunk.length() == 2) { - Log.d(TAG, "Empty data set - marking as succeeded"); - doCompleted(session); - } else { - final RequestBody body = RequestBody.create(MediaType.parse("application/json"), chunk); - - final Call call = session.service.doUpload(session.token, session.datasetReply.getUploadId(), body); - status("Uploading"); - call.enqueue(new TidepoolCallback(session, "Data Upload", () -> { - UploadChunk.setLastEnd(session.end); - - if (REPEAT && !session.exceededIterations()) { - status("Queued Next"); - Log.d(TAG, "Scheduling next upload"); - Inevitable.task("Tidepool-next", 10000, () -> doUpload(session)); - } else { - - if (MOpenDatasetRequest.isNormal()) { - doClose(session); - } else { - doCompleted(session); - } - } - }).setOnFailure(TidepoolUploader::releaseWakeLock)); - } - } else { - Log.e(TAG, "Upload chunk is null, cannot proceed"); - releaseWakeLock(); - } - } - - - private static void doClose(final Session session) { - status("Closing"); - extendWakeLock(20000); - final Call call = session.service.closeDataSet(session.token, session.datasetReply.getUploadId(), new MCloseDatasetRequest().getBody()); - call.enqueue(new TidepoolCallback<>(session, "Session Stop", TidepoolUploader::closeSuccess)); - } - - private static void closeSuccess() { - status("Closed"); - Log.d(TAG, "Close success"); - releaseWakeLock(); - } - - private static void doCompleted(final Session session) { - status("Completed OK"); - Log.d(TAG, "ALL COMPLETED OK!"); - releaseWakeLock(); - } - - private static void status(final String status) { - FastStore.getInstance().putS(STATUS_KEY, status); - } - - private static synchronized void extendWakeLock(long ms) { - if (wl == null) { - wl = JoH.getWakeLock("tidepool-uploader", (int) ms); - } else { - JoH.releaseWakeLock(wl); // lets not get too messy - wl.acquire(ms); - } - } - - protected static synchronized void releaseWakeLock() { - Log.d(TAG, "Releasing wakelock"); - JoH.releaseWakeLock(wl); - } - - // experimental - not used - - private static void deleteData(final Session session) { - if (session.authReply.userid != null) { - Call call = session.service.deleteAllData(session.token, session.authReply.userid); - call.enqueue(new TidepoolCallback<>(session, "Delete Data", null)); - } else { - Log.wtf(TAG, "Got login response but cannot determine userid - cannot proceed"); - } - } - - private static void getDataSet(final Session session) { - Call call = session.service.getDataSet(session.token, "bogus"); - call.enqueue(new TidepoolCallback<>(session, "Get Data", null)); - } - - private static void deleteDataSet(final Session session) { - Call call = session.service.deleteDataSet(session.token, "bogus"); - call.enqueue(new TidepoolCallback<>(session, "Delete Data", null)); - } - -}