Skip to content

Commit e8a1f33

Browse files
committed
Introduce setup for PACECloudSDK
Remove old cloud SDK and use the generated apps endpoints for the requests
1 parent fa2a824 commit e8a1f33

38 files changed

+361
-368
lines changed

README.md

Lines changed: 89 additions & 72 deletions
Large diffs are not rendered by default.

app/build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,4 @@ dependencies {
4343
implementation "androidx.appcompat:appcompat:$appcompat_version"
4444
implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version"
4545
implementation "androidx.preference:preference:$preference_version"
46-
implementation "androidx.fragment:fragment-ktx:$fragment_version"
4746
}

app/src/main/java/cloud/pace/sdk/app/MainActivity.kt

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,15 @@ import android.widget.Toast
1313
import androidx.activity.result.contract.ActivityResultContracts
1414
import androidx.appcompat.app.AlertDialog
1515
import androidx.appcompat.app.AppCompatActivity
16+
import cloud.pace.sdk.PACECloudSDK
1617
import cloud.pace.sdk.appkit.AppKit
1718
import cloud.pace.sdk.appkit.communication.AppCallbackImpl
1819
import cloud.pace.sdk.appkit.model.App
19-
import cloud.pace.sdk.appkit.model.AuthenticationMode
20-
import cloud.pace.sdk.appkit.model.Configuration
2120
import cloud.pace.sdk.idkit.FailedRetrievingSessionWhileAuthorizing
2221
import cloud.pace.sdk.idkit.IDKit
2322
import cloud.pace.sdk.idkit.OIDConfiguration
2423
import cloud.pace.sdk.poikit.POIKit
25-
import cloud.pace.sdk.utils.Environment
26-
import cloud.pace.sdk.utils.Failure
27-
import cloud.pace.sdk.utils.Success
24+
import cloud.pace.sdk.utils.*
2825
import kotlinx.android.synthetic.main.activity_main.*
2926

3027
class MainActivity : AppCompatActivity() {
@@ -52,20 +49,17 @@ class MainActivity : AppCompatActivity() {
5249
)
5350
)
5451

55-
AppKit.setup(
52+
PACECloudSDK.setup(
5653
this, Configuration(
5754
clientAppName = "PACECloudSDKExample",
5855
clientAppVersion = BuildConfig.VERSION_NAME,
5956
clientAppBuild = BuildConfig.VERSION_CODE.toString(),
6057
apiKey = "YOUR_API_KEY",
61-
isDarkTheme = false,
6258
authenticationMode = AuthenticationMode.NATIVE,
6359
environment = Environment.DEVELOPMENT
6460
)
6561
)
6662

67-
POIKit.setup(this, Environment.DEVELOPMENT, "YOUR_API_KEY")
68-
6963
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
7064
registerForActivityResult(ActivityResultContracts.RequestPermission()) {
7165
if (it) {
@@ -197,7 +191,7 @@ class MainActivity : AppCompatActivity() {
197191
if (lastLocation == null || lastLocation.distanceTo(it) > APP_DISTANCE_THRESHOLD) {
198192
AppKit.requestLocalApps { completion ->
199193
if (completion is Success) {
200-
AppKit.openApps(this, completion.result, false, root_layout, callback = object : AppCallbackImpl() {
194+
AppKit.openApps(this, completion.result, root_layout, callback = object : AppCallbackImpl() {
201195
override fun onOpen(app: App?) {
202196
appUrl = app?.url
203197
Toast.makeText(this@MainActivity, "Gas station ID = ${app?.gasStationId}", Toast.LENGTH_SHORT).show()

build.gradle

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ buildscript {
1212
user = properties.get("user")
1313
key = properties.get("key")
1414

15-
cloudsdk_version = "99578622"
1615
gradle_version = "4.0.2"
1716
kotlin_version = "1.4.10"
1817
bintray_version = "1.8.5"

library/build.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ android {
5555
dependencies {
5656
implementation fileTree(dir: "libs", include: ["*.jar"])
5757

58-
implementation "car.pace:cloudsdk:$cloudsdk_version"
59-
6058
// Kotlin
6159
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
6260
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
@@ -66,6 +64,7 @@ dependencies {
6664
implementation "androidx.appcompat:appcompat:$appcompat_version"
6765
implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version"
6866
implementation "androidx.preference:preference:$preference_version"
67+
implementation "androidx.fragment:fragment-ktx:$fragment_version"
6968
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
7069
implementation "androidx.biometric:biometric:$biometric_version"
7170
implementation "androidx.browser:browser:$browser_version"

library/src/androidTest/java/cloud/pace/sdk/appkit/UriManagerTest.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package cloud.pace.sdk.appkit
22

33
import androidx.test.runner.AndroidJUnit4
4+
import cloud.pace.sdk.PACECloudSDK
45
import cloud.pace.sdk.appkit.app.api.UriManagerImpl
56
import cloud.pace.sdk.appkit.app.api.UriManagerImpl.Companion.PARAM_R
67
import cloud.pace.sdk.appkit.app.api.UriManagerImpl.Companion.PARAM_REFERENCES
7-
import cloud.pace.sdk.appkit.model.Configuration
8+
import cloud.pace.sdk.utils.Configuration
89
import cloud.pace.sdk.utils.Environment
910
import junit.framework.Assert.assertEquals
1011
import org.junit.Before
@@ -18,7 +19,7 @@ class UriManagerTest {
1819

1920
@Before
2021
fun init() {
21-
AppKit.configuration = Configuration("", "", "", "", false, environment = Environment.DEVELOPMENT)
22+
PACECloudSDK.configuration = Configuration("", "", "", "", environment = Environment.DEVELOPMENT)
2223
}
2324

2425
@Test
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package cloud.pace.sdk
2+
3+
import android.content.Context
4+
import cloud.pace.sdk.api.API
5+
import cloud.pace.sdk.appkit.AppKit
6+
import cloud.pace.sdk.appkit.persistence.SharedPreferencesModel
7+
import cloud.pace.sdk.utils.CloudSDKKoinComponent
8+
import cloud.pace.sdk.utils.Configuration
9+
import cloud.pace.sdk.utils.KoinConfig
10+
import org.koin.core.inject
11+
12+
object PACECloudSDK : CloudSDKKoinComponent {
13+
14+
private val sharedPreferencesModel: SharedPreferencesModel by inject()
15+
internal lateinit var configuration: Configuration
16+
17+
/**
18+
* Sets up [PACECloudSDK] with the passed [configuration].
19+
* This needs to be called before any of its "Kits" can be used.
20+
*
21+
* @param context The context.
22+
*/
23+
fun setup(context: Context, configuration: Configuration) {
24+
this.configuration = configuration
25+
26+
API.setupAPI("${configuration.environment.apiUrl}/poi/2020-4/", configuration.apiKey, emptyMap())
27+
AppKit.locationAccuracy = configuration.locationAccuracy
28+
KoinConfig.setupCloudSDK(context, configuration.environment, configuration.apiKey)
29+
AppKit.updateUserAgent()
30+
sharedPreferencesModel.deleteAllAppStates()
31+
}
32+
33+
/**
34+
* Replaces the list of optional [extensions] at the end of the user agent (separated with a space).
35+
*/
36+
fun setUserAgentExtensions(extensions: List<String>) {
37+
if (::configuration.isInitialized) {
38+
configuration.extensions = extensions
39+
AppKit.updateUserAgent()
40+
}
41+
}
42+
43+
internal fun setLocationAccuracy(locationAccuracy: Int?) {
44+
if (::configuration.isInitialized) {
45+
configuration.locationAccuracy = locationAccuracy
46+
}
47+
}
48+
49+
internal fun setAccessToken(accessToken: String?) {
50+
if (::configuration.isInitialized) {
51+
configuration.accessToken = accessToken
52+
AppKit.updateUserAgent()
53+
}
54+
}
55+
56+
internal fun resetAccessToken() {
57+
if (::configuration.isInitialized) {
58+
configuration.accessToken = null
59+
}
60+
}
61+
}

library/src/main/java/cloud/pace/sdk/appkit/AppKit.kt

Lines changed: 23 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,93 +2,50 @@ package cloud.pace.sdk.appkit
22

33
import android.content.Context
44
import androidx.constraintlayout.widget.ConstraintLayout
5-
import car.pace.cloudsdk.CloudSDK
6-
import car.pace.cloudsdk.util.DeviceUtils
75
import cloud.pace.sdk.BuildConfig
6+
import cloud.pace.sdk.PACECloudSDK
87
import cloud.pace.sdk.appkit.app.AppActivity
98
import cloud.pace.sdk.appkit.app.drawer.AppDrawer
109
import cloud.pace.sdk.appkit.communication.AppCallbackImpl
1110
import cloud.pace.sdk.appkit.model.App
1211
import cloud.pace.sdk.appkit.model.Car
13-
import cloud.pace.sdk.appkit.model.Configuration
14-
import cloud.pace.sdk.appkit.persistence.SharedPreferencesModel
15-
import cloud.pace.sdk.utils.AppKitKoinComponent
12+
import cloud.pace.sdk.utils.CloudSDKKoinComponent
1613
import cloud.pace.sdk.utils.Completion
17-
import cloud.pace.sdk.utils.KoinConfig
14+
import cloud.pace.sdk.utils.DeviceUtils
15+
import cloud.pace.sdk.utils.Theme
1816
import org.koin.core.inject
1917

20-
object AppKit : AppKitKoinComponent {
18+
object AppKit : CloudSDKKoinComponent {
2119

22-
private val sharedPreferencesModel: SharedPreferencesModel by inject()
2320
private val appManager: AppManager by inject()
24-
25-
internal lateinit var configuration: Configuration
2621
internal lateinit var userAgent: String
2722

2823
/**
29-
* Sets up [AppKit] with the passed [configuration].
30-
*
31-
* @param context The context.
24+
* Specifies whether the light or dark theme should be used for the apps.
3225
*/
33-
fun setup(context: Context, configuration: Configuration) {
34-
this.configuration = configuration
35-
36-
CloudSDK.initialize(
37-
context, CloudSDK.Configuration(
38-
idBaseUrl = configuration.environment.idUrl,
39-
apiBaseUrl = configuration.environment.apiUrl,
40-
clientId = configuration.clientId ?: "",
41-
clientVersion = configuration.clientAppVersion,
42-
clientBuild = configuration.clientAppBuild,
43-
isDarkTheme = configuration.isDarkTheme
44-
)
45-
)
46-
47-
KoinConfig.setupAppKit(context)
48-
setUserAgent(configuration)
49-
sharedPreferencesModel.deleteAllAppStates()
50-
}
51-
52-
fun setThemeSetting(isDarkTheme: Boolean) {
53-
if (::configuration.isInitialized) {
54-
configuration.isDarkTheme = isDarkTheme
55-
setUserAgent(configuration)
26+
var theme: Theme = Theme.LIGHT
27+
set(value) {
28+
field = value
29+
updateUserAgent()
5630
}
57-
}
5831

59-
fun setUserAgentExtensions(extensions: List<String>) {
60-
if (::configuration.isInitialized) {
61-
configuration.extensions = extensions
62-
setUserAgent(configuration)
63-
}
64-
}
65-
66-
fun setLocationAccuracy(locationAccuracy: Int?) {
67-
if (::configuration.isInitialized) {
68-
configuration.locationAccuracy = locationAccuracy
69-
}
70-
}
71-
72-
internal fun setAccessToken(accessToken: String?) {
73-
if (::configuration.isInitialized) {
74-
configuration.accessToken = accessToken
75-
setUserAgent(configuration)
76-
}
77-
}
78-
79-
internal fun resetAccessToken() {
80-
if (::configuration.isInitialized) {
81-
configuration.accessToken = null
32+
/**
33+
* Specifies the minimum location accuracy in meters to request location based apps.
34+
*/
35+
var locationAccuracy: Int? = null
36+
set(value) {
37+
field = value
38+
PACECloudSDK.setLocationAccuracy(value)
8239
}
83-
}
8440

85-
private fun setUserAgent(config: Configuration) {
41+
internal fun updateUserAgent() {
42+
val config = PACECloudSDK.configuration
8643
userAgent = listOf(
8744
"${config.clientAppName}/${config.clientAppVersion}_${config.clientAppBuild}",
8845
"(${DeviceUtils.getDeviceName()} Android/${DeviceUtils.getAndroidVersion()})",
8946
"PWA-SDK/${BuildConfig.VERSION_NAME}",
9047
if (config.clientId != null) "(clientid:${config.clientId};)" else "",
91-
if (config.isDarkTheme) "PWASDK-Theme/Dark" else "PWASDK-Theme/Light",
48+
if (theme == Theme.LIGHT) "PWASDK-Theme/Light" else "PWASDK-Theme/Dark",
9249
"IdentityManagement/${config.authenticationMode.value}",
9350
config.extensions.joinToString(" ")
9451
).filter { it.isNotEmpty() }.joinToString(separator = " ")
@@ -170,7 +127,7 @@ object AppKit : AppKitKoinComponent {
170127
* Clicking on the [AppDrawer] opens the [AppActivity] and shows the App.
171128
*
172129
* @param context Context which should be used to start the [AppActivity].
173-
* @param isDarkBackground True, if the background of the [AppDrawer] should be dark, false otherwise.
130+
* @param theme The [Theme] of the [AppDrawer].
174131
* @param bottomMargin The margin with which the [AppDrawer]s should be drawn to the bottom edge.
175132
* @param autoClose True if the [AppActivity] should be closed automatically when new apps are opened or no apps come back from the API, false otherwise.
176133
* @param callback Via this callback the client app can subscribe to certain app events.
@@ -179,13 +136,13 @@ object AppKit : AppKitKoinComponent {
179136
fun openApps(
180137
context: Context,
181138
apps: List<App>,
182-
isDarkBackground: Boolean,
183139
buttonContainer: ConstraintLayout,
140+
theme: Theme = Theme.LIGHT,
184141
bottomMargin: Float = 16f,
185142
autoClose: Boolean = true,
186143
callback: AppCallbackImpl? = null
187144
) {
188-
appManager.openApps(context, apps, isDarkBackground, buttonContainer, bottomMargin, autoClose, callback)
145+
appManager.openApps(context, apps, buttonContainer, theme, bottomMargin, autoClose, callback)
189146
}
190147

191148
/**

library/src/main/java/cloud/pace/sdk/appkit/AppManager.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import java.net.MalformedURLException
2828
import java.net.URL
2929
import java.util.*
3030

31-
internal class AppManager : AppKitKoinComponent {
31+
internal class AppManager : CloudSDKKoinComponent {
3232

3333
private val context: Context by inject()
3434
private val appLocationManager: AppLocationManager by inject()
@@ -71,7 +71,7 @@ internal class AppManager : AppKitKoinComponent {
7171
* @param completion Returns a list of [App]s on success or a [Throwable] on failure
7272
*/
7373
private fun getAppsByLocation(location: Location, completion: (Completion<List<App>>) -> Unit) {
74-
appRepository.getLocationBasedApps(context, location.latitude, location.longitude, true) { result ->
74+
appRepository.getLocationBasedApps(context, location.latitude, location.longitude) { result ->
7575
result.onSuccess { apps ->
7676
Log.d("Received ${apps.size} Apps: ${apps.map { it.url }}")
7777

@@ -127,7 +127,7 @@ internal class AppManager : AppKitKoinComponent {
127127
}
128128

129129
internal fun requestApps(completion: (Completion<List<App>>) -> Unit) {
130-
appRepository.getAllApps(context, true) { result ->
130+
appRepository.getAllApps(context) { result ->
131131
result.onSuccess { completion(Success(it)) }
132132
result.onFailure { completion(Failure(it)) }
133133
}
@@ -176,7 +176,7 @@ internal class AppManager : AppKitKoinComponent {
176176
context.startActivity(intent)
177177
}
178178

179-
internal fun openApps(context: Context, apps: List<App>, isDarkBackground: Boolean, buttonContainer: ConstraintLayout, bottomMargin: Float, autoClose: Boolean, callback: AppCallbackImpl?) {
179+
internal fun openApps(context: Context, apps: List<App>, buttonContainer: ConstraintLayout, theme: Theme, bottomMargin: Float, autoClose: Boolean, callback: AppCallbackImpl?) {
180180
closeApps(buttonContainer)
181181

182182
var topAppDrawerId: Int? = null
@@ -186,7 +186,7 @@ internal class AppManager : AppKitKoinComponent {
186186
appDrawer.id = View.generateViewId()
187187
appDrawer.layoutParams = ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.WRAP_CONTENT)
188188

189-
appDrawer.setApp(app, isDarkBackground) {
189+
appDrawer.setApp(app, theme == Theme.DARK) {
190190
openAppActivity(context, app, autoClose = autoClose, callback = callback)
191191
}
192192
appDrawer.expand()

library/src/main/java/cloud/pace/sdk/appkit/app/AppActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import cloud.pace.sdk.R
77
import cloud.pace.sdk.appkit.app.webview.AppWebViewClient
88
import cloud.pace.sdk.appkit.communication.AppEventManager
99
import cloud.pace.sdk.appkit.communication.AppModel
10-
import cloud.pace.sdk.utils.AppKitKoinComponent
10+
import cloud.pace.sdk.utils.CloudSDKKoinComponent
1111
import kotlinx.android.synthetic.main.fragment_app.*
1212
import org.koin.android.ext.android.inject
1313

14-
class AppActivity : AppCompatActivity(), AppKitKoinComponent {
14+
class AppActivity : AppCompatActivity(), CloudSDKKoinComponent {
1515

1616
private var backToFinish = true
1717
private val eventManager: AppEventManager by inject()

library/src/main/java/cloud/pace/sdk/appkit/app/AppFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import androidx.browser.customtabs.CustomTabsIntent
99
import androidx.fragment.app.Fragment
1010
import cloud.pace.sdk.R
1111
import cloud.pace.sdk.appkit.app.webview.AppWebViewClient
12-
import cloud.pace.sdk.utils.AppKitKoinComponent
12+
import cloud.pace.sdk.utils.CloudSDKKoinComponent
1313
import kotlinx.android.synthetic.main.fragment_app.*
1414
import org.koin.android.viewmodel.ext.android.viewModel
1515

16-
class AppFragment : Fragment(), AppKitKoinComponent {
16+
class AppFragment : Fragment(), CloudSDKKoinComponent {
1717

1818
private val viewModel: AppFragmentViewModel by viewModel()
1919

0 commit comments

Comments
 (0)