Skip to content

Commit

Permalink
complex app refactor and update hypertrack libraries
Browse files Browse the repository at this point in the history
* features added

* new interface, debug mode, bugfix

* debug trips

* remove test data

* bug fix

* bug fix

* bug fix

* prepare repo
  • Loading branch information
guristas committed Sep 23, 2019
1 parent 5507589 commit ae4c0ca
Show file tree
Hide file tree
Showing 34 changed files with 1,372 additions and 207 deletions.
6 changes: 3 additions & 3 deletions .gitignore
Expand Up @@ -51,13 +51,13 @@ captures/
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
*.keystore

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild

# Google Services (e.g. APIs or Firebase)
# google-services.json
*/google-services.json

# Freeline
freeline.py
Expand All @@ -79,4 +79,4 @@ lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# lint/reports/
56 changes: 35 additions & 21 deletions app/build.gradle
Expand Up @@ -3,67 +3,78 @@ apply plugin: 'io.fabric'

ext {
versionNumber = computeVersionNumber()
versionName = (isSnapshot.toBoolean() ? rootProject.version + "-SNAPSHOT" : rootProject.version)
keystorePath = properties['keystore.path']
versionName = rootProject.version
keystorePath = properties['keystorePath']
storePassword = properties['storePassword']
keyAlias = properties['keyAlias']
keyPassword = properties['keyPassword']
println "Live SDK version is " + versionName
println "rootProject.properties is " + rootProject.properties
}

android {
compileSdkVersion 29
buildToolsVersion "29.0.0"
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.hypertrack.live"
minSdkVersion 19
targetSdkVersion 28
targetSdkVersion 29
versionCode project.ext.versionNumber
versionName project.ext.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
signingConfigs {

release {
storeFile file("/home/denis/Android/hypertrack-prod.jks")
storePassword "hyperTrack3"
keyAlias "live"
keyPassword "htLive3"
if (project.ext.hasProperty("keystorePath")) {
release {
storeFile file(project.ext.keystorePath)
storePassword project.ext.storePassword
keyAlias project.ext.keyAlias
keyPassword project.ext.keyPassword
}
}
}

buildTypes {

debug {
minifyEnabled false
debuggable true
if (signingConfigs.hasProperty("release")) {
signingConfig signingConfigs.release
}
}

release {
minifyEnabled true
shrinkResources true
debuggable false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}

debug {
minifyEnabled false
debuggable true
if (signingConfigs.hasProperty("release")) {
signingConfig signingConfigs.release
}
}
}
}

repositories {
mavenLocal()
maven {
name 'hypertrack'
url 'http://m2.hypertrack.com'
}
maven { url 'https://maven.fabric.io/public' }
mavenLocal()
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.0.0'

implementation("com.hypertrack:hypertrack:3.4.3@aar") {transitive = true}
implementation 'com.hypertrack:hypertrack-views:0.2.0'
implementation("com.hypertrack:hypertrack:3.4.6@aar") {transitive = true}
implementation 'com.hypertrack:hypertrack-views:0.3.3'

implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') {
transitive = true
Expand All @@ -86,4 +97,7 @@ def computeVersionNumber() {
return versionMajor * 1000000 + versionMinor * 1000 + versionPatch
}
throw new Exception("Could not read version.properties!")
}
}

// Google Play services Gradle plugin. Add google-services.json and uncomment
// apply plugin: 'com.google.gms.google-services'
20 changes: 19 additions & 1 deletion app/src/main/AndroidManifest.xml
Expand Up @@ -23,8 +23,8 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:taskAffinity="com.hypertrack.live"
android:theme="@style/AppTheme"
android:name=".App"
tools:ignore="GoogleAppIndexingWarning">

<activity
Expand All @@ -46,6 +46,16 @@
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar"
android:windowSoftInputMode="adjustResize|stateHidden" />
<activity
android:name=".debug.DebugActivity"
android:launchMode="singleInstance"
android:theme="@style/AppTheme.NoActionBar" />

<service android:name="com.hypertrack.sdk.HyperTrackMessagingService" android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

<receiver
android:name=".InstallReferrerReceiver"
Expand All @@ -56,6 +66,14 @@
</intent-filter>
</receiver>

<receiver
android:name=".TrackingErrorReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.hypertrack.sdk.TRACKING_ERROR" />
</intent-filter>
</receiver>

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
Expand Down
160 changes: 160 additions & 0 deletions app/src/main/java/com/hypertrack/live/ApiHelper.java
@@ -0,0 +1,160 @@
package com.hypertrack.live;

import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.hypertrack.live.debug.DebugHelper;
import com.hypertrack.sdk.HyperTrack;

import org.json.JSONException;
import org.json.JSONObject;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class ApiHelper {

private final RequestQueue queue;
private final String hyperTrackPublicKey;
private final Map<String, String> baseHeaders = new HashMap<>();
private final Map<String, String> tripsHeaders;
private final String apiDomain;

public ApiHelper(Context context, String hyperTrackPublicKey) {
// Instantiate the RequestQueue.
queue = Volley.newRequestQueue(context);
this.hyperTrackPublicKey = hyperTrackPublicKey;
baseHeaders.put("Content-Type", "application/json; charset=utf-8");

apiDomain = DebugHelper.getApiDomain(context);
String accountid = DebugHelper.getSharedPreferences(context).getString(DebugHelper.DEV_ACCOUNTID_KEY, "");
String secretkey = DebugHelper.getSharedPreferences(context).getString(DebugHelper.DEV_SECRETKEY_KEY, "");
tripsHeaders = new HashMap<>(baseHeaders);
String authHeader = "Basic " + Base64.encodeToString(
String.format("%s:%s", accountid, secretkey).getBytes(StandardCharsets.UTF_8),
Base64.NO_WRAP);
tripsHeaders.put("Authorization", authHeader);
}

public void createTrip(JSONObject jsonObject, final Response.Listener<JSONObject> listener, final Response.ErrorListener errorListener) {

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST,
"https://" + apiDomain + "/trips/",
jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (listener != null) {
listener.onResponse(response);
}
}
}, new BaseErrorListener(errorListener)) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return new HashMap<>(tripsHeaders);
}
};

queue.add(jsonRequest);
}

public void completeTrip(String tripId, final Response.Listener<String> listener, final Response.ErrorListener errorListener) {

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST,
String.format("https://" + apiDomain + "/trips/%s/complete", tripId), null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
if (listener != null) {
listener.onResponse("");
}
}
}, new BaseErrorListener(errorListener)) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return new HashMap<>(tripsHeaders);
}
};

queue.add(jsonRequest);
}

public void getTrackingId(final Response.Listener<String> listener, final Response.ErrorListener errorListener) {
String url = "https://7kcobbjpavdyhcxfvxrnktobjm.appsync-api.us-west-2.amazonaws.com/graphql";

JSONObject jsonObject = null;
try {
jsonObject = new JSONObject("{\n" +
" \"query\": \"query getPublicTrackingIdQuery($publishableKey: String!, $deviceId: String!){\\\\\n getPublicTrackingId(publishable_key: $publishableKey, device_id: $deviceId){\\\\\n tracking_id\\\\\n }\\\\\n}\"," +
" \"variables\": {" +
" \"publishableKey\": \"" + hyperTrackPublicKey + "\",\n" +
" \"deviceId\": \"" + HyperTrack.getDeviceId() + "\"" +
" }," +
" \"operationName\": \"getPublicTrackingIdQuery\"" +
"}");
} catch (JSONException e) {
e.printStackTrace();
}
// Request a json response from the provided URL.
JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, jsonObject,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// Display the first 500 characters of the response string.
try {
String trackingId = response.getJSONObject("data")
.getJSONObject("getPublicTrackingId")
.getString("tracking_id");
if (listener != null) {
listener.onResponse(trackingId);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new BaseErrorListener(errorListener)) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<>(baseHeaders);
headers.put("X-Api-Key", "da2-nt5vwlflmngjfbe6cbsone4emm");
return headers;
}
};


// Add the request to the RequestQueue.
queue.add(jsonRequest);
}

public static class BaseErrorListener implements Response.ErrorListener {

private final Response.ErrorListener innerErrorListener;

public BaseErrorListener() {
this(null);
}

public BaseErrorListener(Response.ErrorListener errorListener) {
innerErrorListener = errorListener;
}

@Override
public void onErrorResponse(VolleyError error) {
if (innerErrorListener != null) {
innerErrorListener.onErrorResponse(error);
}
error.printStackTrace();
}
}
}
25 changes: 25 additions & 0 deletions app/src/main/java/com/hypertrack/live/App.java
@@ -0,0 +1,25 @@
package com.hypertrack.live;

import android.app.Application;

import com.hypertrack.live.debug.DebugHelper;


public class App extends Application {

private boolean isForeground = false;

public boolean isForeground() {
return isForeground;
}

public void setForeground(boolean foreground) {
isForeground = foreground;
}

@Override
public void onCreate() {
super.onCreate();
DebugHelper.start(this);
}
}
22 changes: 14 additions & 8 deletions app/src/main/java/com/hypertrack/live/LaunchActivity.java
Expand Up @@ -6,6 +6,7 @@
import android.os.Handler;

import com.hypertrack.live.ui.MainActivity;
import com.hypertrack.sdk.HyperTrack;

import java.util.concurrent.TimeUnit;

Expand All @@ -16,13 +17,18 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch);

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(LaunchActivity.this, MainActivity.class));
finish();
}
}, TimeUnit.SECONDS.toMillis(1));
if (HyperTrack.isTracking()) {
startActivity(new Intent(LaunchActivity.this, MainActivity.class));
finish();
} else {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
startActivity(new Intent(LaunchActivity.this, MainActivity.class));
finish();
}
}, TimeUnit.SECONDS.toMillis(1));
}
}
}

0 comments on commit ae4c0ca

Please sign in to comment.