[android] Add Android Auto support #3806
|
@ -38,6 +38,8 @@
|
|||
//-->
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||
<uses-permission android:name="androidx.car.app.NAVIGATION_TEMPLATES"/>
|
||||
<uses-permission android:name="androidx.car.app.ACCESS_SURFACE"/>
|
||||
|
||||
<queries>
|
||||
<intent>
|
||||
|
@ -723,6 +725,14 @@
|
|||
android:name="app.organicmaps.background.OsmUploadService"
|
||||
android:permission="android.permission.BIND_JOB_SERVICE"
|
||||
android:exported="false"/>
|
||||
<service
|
||||
android:name="app.organicmaps.car.NavigationCarAppService"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="androidx.car.app.CarAppService" />
|
||||
<category android:name="androidx.car.app.category.NAVIGATION" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<!-- Catches app upgraded intent -->
|
||||
<receiver
|
||||
|
@ -748,5 +758,13 @@
|
|||
<!-- Disable Google's anonymous stats collection -->
|
||||
<meta-data android:name="android.webkit.WebView.MetricsOptOut" android:value="true" />
|
||||
|
||||
<!-- For android Auto -->
|
||||
<meta-data android:name="com.google.android.gms.car.application"
|
||||
android:resource="@xml/automotive_app_desc"/>
|
||||
|
||||
<meta-data
|
||||
android:name="androidx.car.app.minCarApiLevel"
|
||||
android:value="1"/>
|
||||
|
||||
</application>
|
||||
</manifest>
|
||||
|
|
|
@ -84,6 +84,7 @@ dependencies {
|
|||
|
||||
implementation 'androidx.annotation:annotation:1.5.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0-alpha01'
|
||||
implementation 'androidx.car.app:app:1.3.0-rc01'
|
||||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
||||
implementation 'androidx.fragment:fragment:1.5.4'
|
||||
// Lifecycle is added as a workaround for duplicate classes error caused by some outdated dependency:
|
||||
|
@ -97,6 +98,8 @@ dependencies {
|
|||
implementation 'androidx.work:work-runtime:2.7.1'
|
||||
implementation 'com.google.android.material:material:1.8.0-alpha02'
|
||||
implementation 'com.google.code.gson:gson:2.10'
|
||||
// Fix for app/organicmaps/util/FileUploadWorker.java:14: error: cannot access ListenableFuture
|
||||
implementation 'com.google.guava:guava:29.0-android'
|
||||
implementation 'com.timehop.stickyheadersrecyclerview:library:0.4.3@aar'
|
||||
implementation 'com.github.devnullorthrow:MPAndroidChart:3.2.0-alpha'
|
||||
implementation 'net.jcip:jcip-annotations:1.0'
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
propMinSdkVersion=21
|
||||
propMinSdkVersion=23
|
||||
propTargetSdkVersion=33
|
||||
propCompileSdkVersion=33
|
||||
propBuildToolsVersion=33.0.0
|
||||
|
|
5
android/res/drawable/ic_check_box.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M19,5v14H5V5h14m0,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
|
||||
</vector>
|
5
android/res/drawable/ic_check_box_checked.xml
Normal file
|
@ -0,0 +1,5 @@
|
|||
<vector android:height="24dp"
|
||||
android:viewportHeight="24" android:viewportWidth="24"
|
||||
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<path android:fillColor="@android:color/white" android:pathData="M19,3L5,3c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.11,0 2,-0.9 2,-2L21,5c0,-1.1 -0.89,-2 -2,-2zM10,17l-5,-5 1.41,-1.41L10,14.17l7.59,-7.59L19,8l-9,9z"/>
|
||||
</vector>
|
4
android/res/xml/automotive_app_desc.xml
Normal file
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<automotiveApp>
|
||||
<uses name="template" />
|
||||
</automotiveApp>
|
30
android/src/app/organicmaps/car/NavigationCarAppService.java
Normal file
|
@ -0,0 +1,30 @@
|
|||
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
package app.organicmaps.car;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
import androidx.annotation.NonNull;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
import androidx.car.app.CarAppService;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
import androidx.car.app.Session;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
import androidx.car.app.validation.HostValidator;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
import app.organicmaps.BuildConfig;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
public final class NavigationCarAppService extends CarAppService
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
{
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
@NonNull
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
@Override
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
public HostValidator createHostValidator()
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
{
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
if (BuildConfig.DEBUG)
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
return new HostValidator.Builder(getApplicationContext())
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
.addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
.build();
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
}
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
@NonNull
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
@Override
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
public Session onCreateSession()
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
{
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
return new NavigationSession();
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
}
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
||||
}
|
||||
rtsisyk
commented
What are potential security implications here? What are potential security implications here?
AndrewShkrob
commented
Код из примера. Объяснений, для чего это сделано, нигде не нашел Код из примера. Объяснений, для чего это сделано, нигде не нашел
[Ссылка на пример](https://github.com/android/car-samples/blob/03440d5e974a060d0216b5e02a7fe3c46b7b9469/car_app_library/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/NavigationCarAppService.java)
![]() У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии. У нас принято разбираться и писать только тот код, который мы чётко понимаем, для чего и зачем он нужен. И стараемся, чтобы было понятно другим, кто читает код, в т.ч. оставляя комментарии.
AndrewShkrob
commented
Вот такое объяснение в документации.
Вот такое объяснение в документации.
```java
/**
* Returns the {@link HostValidator} this service will use to accept or reject host connections.
*
* <p>By default, the provided {@link HostValidator.Builder} would produce a validator that
* only accepts connections from hosts holding
* {@link HostValidator#TEMPLATE_RENDERER_PERMISSION} permission.
*
* <p>Application developers are expected to also allow connections from known hosts which
* don't hold the aforementioned permission (for example, Android Auto and Android
* Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
*
* <p>Refer to {@code androidx.car.app.R.array.hosts_allowlist_sample} to obtain a
* list of package names and signatures that should be allow-listed by default.
*
* <p>It is also advised to allow connections from unknown hosts in debug builds to facilitate
* debugging and testing.
*
* <p>Below is an example of this method implementation:
*
* <pre>
* @Override
* @NonNull
* public HostValidator createHostValidator() {
* if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {
* return HostValidator.ALLOW_ALL_HOSTS_VALIDATOR;
* } else {
* return new HostValidator.Builder(context)
* .addAllowedHosts(androidx.car.app.R.array.hosts_allowlist_sample)
* .build();
* }
* }
* </pre>
*/
```
![]()
1. Так какие приложения перечислены в androidx.car.app.R.array.hosts_allowlist_sample ? Я так понял, для работы с апи <31 нам придётся их перечислить.
2. Почему бы для отладки не сделать проще: if (BuildConfig.DEBUG) ?
3. код может быть проще:
```
if ()
return ...;
return ...;
```
AndrewShkrob
commented
Все не так. Почитал я, как работает HostValidator класс.
Поэтому я заменил Warning:
Все не так. Почитал я, как работает HostValidator класс.
* Он проверяет Host, т.е. магнитолу на которой запускается AA
* Подключение к хосту разрешается в двух случаях
* Либо хост указан в списке, который мы передаем
* Либо хост имеет у себя `android.car.permission.TEMPLATE_RENDERER`
Поэтому я заменил `R.array.car_hosts` на `androidx.car.app.R.array.hosts_allowlist_sample`. Думаю, смысла держать свой список разрешенных хостов нет, а на warning можно закрыть глаза.
Warning:
>The resource @array/hosts_allowlist_sample is marked as private in androidx.car.app:app:1.3.0-rc01
![]() Так что именно в этом файле-то? ) Так что именно в этом файле-то? )
AndrewShkrob
commented
В Первая часть - цифровая подпись, вторая - имя пакета
Только сейчас обратил внимание на это:
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что. В `androidx.car.app.R.array.hosts_allowlist_sample`?
Массив таких строк:
`fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,com.google.android.projection.gearhead`
Первая часть - цифровая подпись, вторая - имя пакета
```java
* @param packageName host package name (as reported by {@link PackageManager})
* @param digest SHA256 digest of the DER encoding of the allow-listed host
* certificate, formatted as 32 lowercase 2 digits hexadecimal values
* separated by colon (e.g.:"000102030405060708090a0b0c0d0e0f101112131415
* 161718191a1b1c1d1e1f"). When using
* <a href="https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation">signature
* rotation</a>, this digest should correspond to the initial signing
* certificate
```
Только сейчас обратил внимание на это:
>Application developers are expected to also allow connections from known hosts which don't hold the aforementioned permission (for example, Android Auto and Android Automotive OS hosts below API level 31), by allow-listing the signatures of those hosts.
Но я не смог найти никакого общего списка хостов или хотя бы какого-то упоминания о том, что люди добавляли в этот список еще что-то. Поэтому, наверное, можно на это не обращать внимания. По крайней мере пока что.
![]()
1. Полный список пакетов в том файле можно выложить сюда или на pastebin?
2. Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
AndrewShkrob
commented
```xml
<string-array name="hosts_allowlist_sample" translatable="false">
<item>fdb00c43dbde8b51cb312aa81d3b5fa17713adb94b28f598d77f8eb89daceedf,
com.google.android.projection.gearhead</item>
<item>70811a3eacfd2e83e18da9bfede52df16ce91f2e69a44d21f18ab66991130771,
com.google.android.projection.gearhead</item>
<item>1975b2f17177bc89a5dff31f9e64a6cae281a53dc1d1d59b1d147fe1c82afa00,
com.google.android.projection.gearhead</item>
<item>c241ffbc8e287c4e9a4ad19632ba1b1351ad361d5177b7d7b29859bd2b7fc631,
com.google.android.apps.automotive.templates.host</item>
<item>dd66deaf312d8daec7adbe85a218ecc8c64f3b152f9b5998d5b29300c2623f61,
com.google.android.apps.automotive.templates.host</item>
<item>50e603d333c6049a37bd751375d08f3bd0abebd33facd30bd17b64b89658b421,
com.google.android.apps.automotive.templates.host</item>
</string-array>
```
AndrewShkrob
commented
Тут если что подразумевается API хоста, а не телефона >Т.к. мы хотим поддержку с API 24, то видимо это нас коснётся. Поэтому хотелось бы сразу понимать масштабы проблемы.
Тут если что подразумевается API хоста, а не телефона
|
69
android/src/app/organicmaps/car/NavigationSession.java
Normal file
|
@ -0,0 +1,69 @@
|
|||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
package app.organicmaps.car;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import android.content.Intent;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import android.util.Log;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import androidx.annotation.NonNull;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import androidx.car.app.Screen;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import androidx.car.app.Session;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import app.organicmaps.MwmApplication;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import app.organicmaps.car.screens.ErrorScreen;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import app.organicmaps.car.screens.NavigationScreen;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
import java.io.IOException;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
public final class NavigationSession extends Session implements DefaultLifecycleObserver
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
private static final String TAG = NavigationSession.class.getSimpleName();
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
private final SurfaceRenderer mSurfaceRenderer;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
private boolean mInitFailed = false;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
public NavigationSession()
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
getLifecycle().addObserver(this);
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
mSurfaceRenderer = new SurfaceRenderer(getCarContext(), getLifecycle());
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
@NonNull
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
@Override
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
public Screen onCreateScreen(@NonNull Intent intent)
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
Log.d(TAG, "onCreateScreen()");
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
if (mInitFailed)
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
rtsisyk
commented
Do you plan to show any error messages on car screen in the future? Do you plan to show any error messages on car screen in the future?
AndrewShkrob
commented
Да. Надо поработать над Да. Надо поработать над `ErrorScreen`. Возможно вообще сделать какой-то общий экран для отображения всех сообщений. Например, ошибка инициализации (как здесь), запрос permisiions и т.д.
|
||||
return new ErrorScreen(getCarContext());
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
return new NavigationScreen(getCarContext(), mSurfaceRenderer);
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
@Override
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
public void onCreate(@NonNull LifecycleOwner owner)
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
Log.d(TAG, "onCreate()");
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
init();
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
@Override
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
public void onResume(@NonNull LifecycleOwner owner)
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
Log.d(TAG, "onResume()");
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
init();
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
private void init()
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
mInitFailed = false;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
MwmApplication app = MwmApplication.from(getCarContext());
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
try
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
app.init();
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
rtsisyk
commented
I thought that MwmApplication should be already initialized by SplashScreen. Why do we need to initialize it second time? Please help me to understand the lifecycle. I thought that MwmApplication should be already initialized by SplashScreen. Why do we need to initialize it second time? Please help me to understand the lifecycle.
AndrewShkrob
commented
Нет.
Но это все тема для отдельного PR Нет. `SplashScreen` вообще не будет запускаться.
У нас есть заблокированный телефон, на котором карты не открыты. Мы его подключаем к AA. Запустится `NavigationSession`, в котором и будет вызван `init`.
Вариант, когда карты открыты одновременно и на телефоне, и на AA невозможен.
По-хорошему да, тут должна быть реализована сложная логика:
* проверить, запущено ли приложение на телефоне
* если запущено, то при подключении AA:
* не инициализировать снова
* перерисовать карты на экран AA
* на телефоне показать уведомление, что карты теперь на AA и закрыть приложение
* либо реализовать какую-нибудь Activity-заглушку с базовыми возможностями
Но это все тема для отдельного PR
![]()
1. Как гугл себя ведёт на телефоне при подключении к AA? На айфоне работают карты и там, и там. Удобно выбирать и прокладывать маршрут на телефоне. В режиме навигации на телефоне список дирекшнс.
2. Всмысле тема для отдельного PR? АА будет сделан на одном PR, после мержа которого будет релиз, и дороги назад не будет. Ломать мастер мержем недоделанного PR мы не будем. Или есть какой-то другой план?
AndrewShkrob
commented
1. Гугл выдает сообщение типа "открыто на Android Auto" и не дает открыть приложение. В теории, конечно, можно сделать, чтобы карты работали и там, и там, но, мне кажется, это будет очень сложно.
2. А для чего нам тогда отдельная ветка под AA? Хранить все в одном PR на 10+ тысяч строк кода как-то не очень хорошо, наверное
![]() Откуда будет 10К строк кода? Мы обсуждали ранее — всё, что можно втянуть в мастер, не ломая его, надо втягивать в мастер, и ребейзить ветку поверх. Не должно быть никаких squash коммитов с мастера, они мешают. Откуда будет 10К строк кода? Мы обсуждали ранее — всё, что можно втянуть в мастер, не ломая его, надо втягивать в мастер, и ребейзить ветку поверх. Не должно быть никаких squash коммитов с мастера, они мешают.
AndrewShkrob
commented
Я прикинул и у меня получилось +/- 10к на весь модуль AA. Если будет меньше, супер. Я прикинул и у меня получилось +/- 10к на весь модуль AA. Если будет меньше, супер.
Я просто сделал пару экранов для настроек и экраны поиска, категорий и закладок без всякой логики, только отрисовка. Уже PR на 1к строк. И это только начало.
Я предполагал, что мы будем делать небольшие PR'ы в ветку `aa`, и когда фича будет закончена, вмержим ее в мастер. Если это не так, то тогда я не понимаю, зачем нужна отдельная ветка
![]() Всё верно. Но каждый PR должен быть достаточно законченным и доделанным, без временных костылей. Всё верно. Но каждый PR должен быть достаточно законченным и доделанным, без временных костылей.
rtsisyk
commented
Здесь всё обсудили в целом уже. F-Droid я посмотрю сам. Здесь всё обсудили в целом уже. F-Droid я посмотрю сам.
|
||||
} catch (IOException e)
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
{
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
mInitFailed = true;
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
Log.e(TAG, "Failed to initialize the app.");
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
||||
}
|
||||
rtsisyk
commented
We can follow the same logic as for myPosition button?
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone. We can follow the same logic as for myPosition button?
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/MwmActivity.java#L650-L654
LocationHelper works without Activity, but will not display error dialogs and permission resolution screens. This operation should be performed on the phone.
AndrewShkrob
commented
Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в
Я считаю, это лучше сделать в отдельном PR Я пробовал, работает так же, как и моя предыдущая реализация еще до этих изменений в `LocationHelper`
Просто тремя строчками тут не обойтись
Из тех проблем, что я вижу сейчас:
* Просто отображается синяя точка. Иногда может нарисовать стрелочку, но чаще просто синяя точка
* Если местоположение отображается, то появляются проблемы с `onScale`. Всегда скейлится относительно местоположения, а не точки на экране
* Плюс все равно надо реализовывать кнопку с разными иконками
Я считаю, это лучше сделать в отдельном PR
![]()
1. Синяя точка означает, что прилетает только позиция, без компаса/сторон света. Надо разбираться, почему.
2. Отдельного PR не будет. Или имеется ввиду отдельный PR на ветку AA? Тогда ок.
![]() Лишняя строка Лишняя строка
![]() Зачем этот флаг? Можно ли без него? Зачем этот флаг? Можно ли без него?
AndrewShkrob
commented
В будущем, думаю, можно. Сейчас сделал так. В будущем, думаю, можно. Сейчас сделал так.
Если очень не нравится, могу удалить эту часть с сообщением об ошибке + `ErrorScreen`.
Но временные костыли в любом случае неизбежны.
|
172
android/src/app/organicmaps/car/SurfaceRenderer.java
Normal file
|
@ -0,0 +1,172 @@
|
|||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
package app.organicmaps.car;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import android.graphics.Rect;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import android.util.Log;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.annotation.NonNull;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.annotation.Nullable;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.car.app.AppManager;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.car.app.CarContext;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.car.app.CarToast;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.car.app.SurfaceCallback;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.car.app.SurfaceContainer;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.lifecycle.DefaultLifecycleObserver;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import androidx.lifecycle.LifecycleOwner;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import app.organicmaps.Map;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
import app.organicmaps.R;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public class SurfaceRenderer implements DefaultLifecycleObserver, SurfaceCallback
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
rtsisyk
commented
У меня при хаотичных нажатиях на +/- крешится вот в этом месте:
У меня при хаотичных нажатиях на +/- крешится вот в этом месте:
https://github.com/organicmaps/organicmaps/blob/c9b77a292d26b6249dba9dfb570fba91e9fc371b/drape_frontend/screen_operations.cpp#L128
```
abort 0x0000007e68aaf3c4
__assert2 0x0000007e68aaf788
df::ScaleInto(const ScreenBase &, const m2::Rect<…> &) screen_operations.cpp:128
df::Navigator::SetFromScreen(const ScreenBase &, unsigned int, double) navigator.cpp:28
df::Navigator::SetFromScreen(const ScreenBase &) navigator.cpp:23
df::UserEventStream::ApplyAnimations() user_event_stream.cpp:295
df::UserEventStream::ProcessEvents(bool &, bool &) user_event_stream.cpp:264
df::FrontendRenderer::ProcessEvents(bool &, bool &) frontend_renderer.cpp:2537
df::FrontendRenderer::RenderFrame() frontend_renderer.cpp:1742
df::BaseRenderer::IterateRenderLoopImpl() base_renderer.cpp:64
df::BaseRenderer::IterateRenderLoop() base_renderer.cpp:59
df::FrontendRenderer::Routine::Do() frontend_renderer.cpp:2441
threads::RunRoutine(std::__ndk1::shared_ptr<…>) thread.cpp:24
decltype(std::__ndk1::forward<void (*)(std::__ndk1::shared_ptr<threads::IRoutine>)>(fp)(std::__ndk1::forward<std::__ndk1::shared_ptr<threads::IRoutine> >(fp0))) std::__ndk1::__invoke<void (*)(std::__ndk1::shared_ptr<threads::IRoutine>), std::__ndk1::shared_ptr<threads::IRoutine> >(void (*&&)(std::__ndk1::shared_ptr<threads::IRoutine>), std::__ndk1::shared_ptr<threads::IRoutine>&&) type_traits:3874
std::__ndk1::__thread_execute<…>(std::__ndk1::tuple<…> &, std::__ndk1::__tuple_indices<…>) thread:273
std::__ndk1::__thread_proxy<…>(void *) thread:284
__pthread_start(void *) 0x0000007e68b12b3c
__start_thread 0x0000007e68ab0c64
```
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
rtsisyk
commented
Еще один креш при +/-:
Еще один креш при +/-:
https://github.com/organicmaps/organicmaps/blob/c9b77a292d26b6249dba9dfb570fba91e9fc371b/drape_frontend/screen_operations.cpp#L124
```
abort 0x0000007e68aaf3c4
__assert2 0x0000007e68aaf788
jni::AndroidLogMessage(base::LogLevel, const base::SrcPoint &, const std::__ndk1::basic_string<…> &) logging.cpp:45
$_21::operator()(double) const screen_operations.cpp:124
df::ScaleInto(const ScreenBase &, const m2::Rect<…> &) screen_operations.cpp:131
df::Navigator::SetFromScreen(const ScreenBase &, unsigned int, double) navigator.cpp:28
df::Navigator::SetFromScreen(const ScreenBase &) navigator.cpp:23
df::UserEventStream::SetScreen(const ScreenBase &, bool, const std::__ndk1::function<…> &) user_event_stream.cpp:549
df::UserEventStream::OnMove(ref_ptr<…>) user_event_stream.cpp:378
df::UserEventStream::ProcessEvents(bool &, bool &) user_event_stream.cpp:176
df::FrontendRenderer::ProcessEvents(bool &, bool &) frontend_renderer.cpp:2537
df::FrontendRenderer::RenderFrame() frontend_renderer.cpp:1742
df::BaseRenderer::IterateRenderLoopImpl() base_renderer.cpp:64
df::BaseRenderer::IterateRenderLoop() base_renderer.cpp:59
df::FrontendRenderer::Routine::Do() frontend_renderer.cpp:2441
threads::RunRoutine(std::__ndk1::shared_ptr<…>) thread.cpp:24
decltype(std::__ndk1::forward<void (*)(std::__ndk1::shared_ptr<threads::IRoutine>)>(fp)(std::__ndk1::forward<std::__ndk1::shared_ptr<threads::IRoutine> >(fp0))) std::__ndk1::__invoke<void (*)(std::__ndk1::shared_ptr<threads::IRoutine>), std::__ndk1::shared_ptr<threads::IRoutine> >(void (*&&)(std::__ndk1::shared_ptr<threads::IRoutine>), std::__ndk1::shared_ptr<threads::IRoutine>&&) type_traits:3874
std::__ndk1::__thread_execute<…>(std::__ndk1::tuple<…> &, std::__ndk1::__tuple_indices<…>) thread:273
std::__ndk1::__thread_proxy<…>(void *) thread:284
__pthread_start(void *) 0x0000007e68b12b3c
__start_thread 0x0000007e68ab0c64
```
|
||||
private static final String TAG = SurfaceRenderer.class.getSimpleName();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
private final CarContext mCarContext;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
private final Map mMap;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Nullable
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
private Rect mVisibleArea;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Nullable
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
private Rect mStableArea;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public SurfaceRenderer(@NonNull CarContext carContext, @NonNull Lifecycle lifecycle)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "SurfaceRenderer()");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mCarContext = carContext;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap = new Map();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
lifecycle.addObserver(this);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "Surface available " + surfaceContainer);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onSurfaceCreated(
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
rtsisyk
commented
Could you please explain how both mobile and car work at the same time? On my phone I still see the map, but with different DPI. I don't really understand how is it possible. Could you please explain how both mobile and car work at the same time? On my phone I still see the map, but with different DPI. I don't really understand how is it possible.
https://github.com/organicmaps/organicmaps/blob/e9056f11fbc2cf3c41850701302bba305cbde95a/android/src/app/organicmaps/Map.java#L120-L123
AndrewShkrob
commented
Никак. Мы это обсуждали еще в первых сообщениях этого PR.
Поддержки одновременной работы на телефоне и на AA не будет. Никак. Мы это обсуждали еще в первых сообщениях этого PR.
> @biodranik, please don't overcomplicate things. Yes, it is technically possible in theory. Duplicating in OpenGL/Vulkan should be relatively easy, but the primary challenge on this road will be different screen sizes/resolutions in Auto and on the device. Basically, it will require the full duplication of rendering logic. As far as I can see, entire Google Inc. and Yandex were unable to implement this feature in their Android Auto implementations so far. Let's get Auto screen working first with disabled rendering in the main app.
Поддержки одновременной работы на телефоне и на AA не будет.
Подробнее здесь https://git.omaps.dev/organicmaps/organicmaps/pulls/3806#discussion_r1043697281
![]() Нужен удобный UX. Вариант, когда например нужно выбрать сначала маршрут на телефоне, и только потом заработает карта навигатора AA, тоже можно рассмотреть. А вообще, лучше сделать невозможное. По возможности. Нужен удобный UX. Вариант, когда например нужно выбрать сначала маршрут на телефоне, и только потом заработает карта навигатора AA, тоже можно рассмотреть. А вообще, лучше сделать невозможное. По возможности.
rtsisyk
commented
Обсудили это в чате. Обсудили это в чате.
|
||||
mCarContext,
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
surfaceContainer.getSurface(),
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
new Rect(0, 0, surfaceContainer.getWidth(), surfaceContainer.getHeight()),
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
surfaceContainer.getDpi()
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onVisibleAreaChanged(@NonNull Rect visibleArea)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "Visible area changed. stableArea: " + mStableArea + " visibleArea:" + visibleArea);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
![]() У нас кажется уже были логи без тэгов? У нас кажется уже были логи без тэгов?
AndrewShkrob
commented
Не понял комментария. Не понял комментария.
Касаемо логов в `onVisibleAreaChanged` и `onStableAreaChanged`:
Это сделано на будущее. Эти изменения придется учитывать, например двигать центр карты в центр visibleArea и т.п. Со всем этим еще надо разбираться. Потом логи можно будет удалить.
rtsisyk
commented
Логов без TAG у нас нет. Но сейчас лучше использовать Логов без TAG у нас нет. Но сейчас лучше использовать `Logger.d(TAG,` из `import app.organicmaps.util.log.Logger;`.
|
||||
mVisibleArea = visibleArea;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onStableAreaChanged(@NonNull Rect stableArea)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "Stable area changed. stableArea: " + mStableArea + " visibleArea:" + mVisibleArea);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mStableArea = stableArea;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "Surface destroyed");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onSurfaceDestroyed(false, true);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onCreate(@NonNull LifecycleOwner owner)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onCreate");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mCarContext.getCarService(AppManager.class).setSurfaceCallback(this);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
// TODO: Properly process deep links from other apps on AA.
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
boolean launchByDeepLink = false;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
![]() // TODO: Properly process deep links from other apps on AA. АА вообще позволяет из одних приложений открывать другие? Что будет, если потыкать линки на нашей тестовой странице https://omaps.app/api ? // TODO: Properly process deep links from other apps on AA.
АА вообще позволяет из одних приложений открывать другие? Что будет, если потыкать линки на нашей тестовой странице https://omaps.app/api ?
AndrewShkrob
commented
Позволяет:
Касаемо https://omaps.app/api Позволяет:
* Голосовой ввод через гугл ассистент
* Есть приложения по типу поиска парковочных мест, которые могут запустить карту
Касаемо https://omaps.app/api
В AA браузера нет, поэтому с такими ссылками это работать не будет. Можно через телефон их открывать и переадресовывать в AA, но это уже другая история.
rtsisyk
commented
Давайте пока без deeplink здесь обойдемся. Комментарий пусть висит. Давайте пока без deeplink здесь обойдемся. Комментарий пусть висит.
|
||||
mMap.onCreate(launchByDeepLink);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onStart(@NonNull LifecycleOwner owner)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onStart");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onStart();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.setCallbackUnsupported(this::reportUnsupported);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onStop(@NonNull LifecycleOwner owner)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onStop");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onStop();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.setCallbackUnsupported(null);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onPause(@NonNull LifecycleOwner owner)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onPause");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onPause(mCarContext);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onResume(@NonNull LifecycleOwner owner)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onResume");
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onResume();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onScroll(float distanceX, float distanceY)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onScroll: distanceX: " + distanceX + ", distanceY: " + distanceY);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
mMap.onScroll(distanceX, distanceY);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onFling(float velocityX, float velocityY)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onFling: velocityX: " + velocityX + ", velocityY: " + velocityY);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onZoomIn()
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Map.zoomIn();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
rtsisyk
commented
У меня по клику на +/- карта двигается вверх/вниз вместо zoom in / zoom out. У меня по клику на +/- карта двигается вверх/вниз вместо zoom in / zoom out.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onZoomOut()
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Map.zoomOut();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onScale(float focusX, float focusY, float scaleFactor)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onScale: focusX: " + focusX + ", focusY: " + focusY + ", scaleFactor: " + scaleFactor);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
float x = focusX;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
float y = focusY;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Rect visibleArea = mVisibleArea;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
if (visibleArea != null)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
// If a focal point value is negative, use the center point of the visible area.
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
if (x < 0)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
x = visibleArea.centerX();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
if (y < 0)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
y = visibleArea.centerY();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
final boolean animated = Float.compare(scaleFactor, 2f) == 0;
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Map.onScale(scaleFactor, x, y, animated);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
@Override
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
public void onClick(float x, float y)
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.d(TAG, "onClick: x: " + x + ", y: " + y);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Map.onTouch(x, y);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
private void reportUnsupported()
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
{
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
String message = mCarContext.getString(R.string.unsupported_phone);
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
Log.e(TAG, mCarContext.getString(R.string.unsupported_phone));
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
CarToast.makeText(mCarContext, message, CarToast.LENGTH_LONG).show();
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
||||
}
|
||||
![]() Скобки для однострочников не используем. Скобки для однострочников не используем.
![]() По возможности везде используем final, легче тогда читать код. По возможности везде используем final, легче тогда читать код.
|
47
android/src/app/organicmaps/car/UiHelpers.java
Normal file
|
@ -0,0 +1,47 @@
|
|||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
package app.organicmaps.car;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.annotation.NonNull;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.CarContext;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.CarToast;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.ScreenManager;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.model.Action;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.model.ActionStrip;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.model.CarIcon;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.car.app.navigation.model.MapController;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import app.organicmaps.R;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
import app.organicmaps.car.screens.settings.SettingsScreen;
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
public final class UiHelpers
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
{
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
public static ActionStrip createSettingsActionStrip(@NonNull CarContext context, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
{
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final CarIcon iconSettings = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_settings)).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final Action settings = new Action.Builder().setIcon(iconSettings).setOnClickListener(
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
() -> context.getCarService(ScreenManager.class).push(new SettingsScreen(context, surfaceRenderer))
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
return new ActionStrip.Builder().addAction(settings).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
}
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
public static MapController createMapController(@NonNull CarContext context, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
{
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final CarIcon iconPlus = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_plus)).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final CarIcon iconMinus = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_minus)).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final CarIcon iconLocation = new CarIcon.Builder(IconCompat.createWithResource(context, R.drawable.ic_not_follow)).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final Action panAction = new Action.Builder(Action.PAN).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final Action location = new Action.Builder().setIcon(iconLocation).setOnClickListener(
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
() -> CarToast.makeText(context, "Location", CarToast.LENGTH_LONG).show()
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final Action zoomIn = new Action.Builder().setIcon(iconPlus).setOnClickListener(surfaceRenderer::onZoomIn).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final Action zoomOut = new Action.Builder().setIcon(iconMinus).setOnClickListener(surfaceRenderer::onZoomOut).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
final ActionStrip mapActionStrip = new ActionStrip.Builder()
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
.addAction(location)
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
.addAction(zoomIn)
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
.addAction(zoomOut)
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
.addAction(panAction)
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
.build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
return new MapController.Builder().setMapActionStrip(mapActionStrip).build();
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
}
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
||||
}
|
||||
rtsisyk
commented
I suggest merging this code back to I suggest merging this code back to `SettingsScreen.java`. It is not needed anywhere outside `SettingsScreen.java`.
rtsisyk
commented
It looks like a hack. Why this invalidation is needed in this place? It looks like a hack. Why this invalidation is needed in this place?
AndrewShkrob
commented
Да, но Да, но `createSharedPrefsCheckbox`, как и `createDrivingOptionCheckbox` использует иконки чекбоксов. Не хочется каждый раз заново инициализировать иконки. Перемещение их в `SettingsScreen` приведет к тому, что они будут заново инициализироваться при создании экрана. Плюс есть еще `DrivingOptionsScreen`, который использует эти же иконки. Надо придумать, где и как их хранить. Это относится не только к чекбоксам, но и к остальным иконкам на других экранах. Пока что решение такое.
AndrewShkrob
commented
Нельзя изменить иконку на созданном объекте:
Видимо, такая концепция AA. Приходится перерисовывать весь экран. Нельзя изменить иконку на созданном объекте:
* Создание происходит через Builder. На этапе установки обработчика невозможно получить доступ к объекту
* В объектах нет методов для изменения его состояния. Т.е. какого-нибудь `setIcon(...)` нет.
Видимо, такая концепция AA. Приходится перерисовывать весь экран.
![]() Там ещё есть ограничение, насколько часто можно перерисовывать экран. Там ещё есть ограничение, насколько _часто_ можно перерисовывать экран.
AndrewShkrob
commented
Перерисовывать один и тот же экран можно неограниченное количество раз Перерисовывать один и тот же экран можно неограниченное количество раз
https://developer.android.com/static/training/cars/Android%20for%20Cars%20App%20Library%20design%20guidelines.pdf
Слайд 11
AndrewShkrob
commented
Ну и конкретно для MapTemplate:
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate Ну и конкретно для MapTemplate:
> Template Restrictions In regards to template refreshes, as described in [onGetTemplate](https://developer.android.com/reference/androidx/car/app/Screen#onGetTemplate()), this template is considered a refresh of a previous one if:
The template title has not changed, and the number of rows and the title (not counting spans) of each row between the previous and new [Pane](https://developer.android.com/reference/androidx/car/app/model/Pane)s or [ItemList](https://developer.android.com/reference/androidx/car/app/model/ItemList)s have not changed.
https://developer.android.com/reference/androidx/car/app/navigation/model/MapTemplate
![]()
1. Зачем что-то хранить в памяти, если оно не видно на экране/не используется, и нужно только в каких-то исключительных сценариях?
2. На сколько большой оверхед от этих иконок, что от него важно прямо сейчас подстраховаться?
![]()
```suggestion
builder.setImage(getter.get() ? mCheckboxSelectedIcon : mCheckboxIcon);
```
![]() Если getter.get() используется больше одного раза, имеет смысл вынести его в Если getter.get() используется больше одного раза, имеет смысл вынести его в `final boolean`
![]() ditto ditto
AndrewShkrob
commented
Ок. Перенес это в Ок. Перенес это в `SettingsScreen` и `DrivingOptionsScreen`
|
135
android/src/app/organicmaps/car/screens/BookmarksScreen.java
Normal file
|
@ -0,0 +1,135 @@
|
|||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
package app.organicmaps.car.screens;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import android.graphics.drawable.Drawable;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.annotation.NonNull;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.annotation.Nullable;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.CarContext;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.constraints.ConstraintManager;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.model.Action;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.model.CarIcon;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.model.Header;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.model.ItemList;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.model.Row;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.model.Template;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.car.app.navigation.model.MapTemplate;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.R;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.bookmarks.data.BookmarkCategory;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.bookmarks.data.BookmarkInfo;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.bookmarks.data.BookmarkManager;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.car.UiHelpers;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import app.organicmaps.util.Graphics;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import java.util.ArrayList;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
import java.util.List;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
public class BookmarksScreen extends MapScreen
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private final int MAX_CATEGORIES_SIZE;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@Nullable
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private BookmarkCategory mBookmarkCategory;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
public BookmarksScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
super(carContext, surfaceRenderer);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final ConstraintManager constraintManager = getCarContext().getCarService(ConstraintManager.class);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
MAX_CATEGORIES_SIZE = constraintManager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_LIST);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private BookmarksScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer, @NonNull BookmarkCategory bookmarkCategory)
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
this(carContext, surfaceRenderer);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
mBookmarkCategory = bookmarkCategory;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@NonNull
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@Override
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
public Template onGetTemplate()
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
MapTemplate.Builder builder = new MapTemplate.Builder();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.setHeader(createHeader());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.setActionStrip(UiHelpers.createSettingsActionStrip(getCarContext(), getSurfaceRenderer()));
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.setItemList(mBookmarkCategory == null ? createBookmarkCategoriesList() : createBookmarksList());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
return builder.build();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@NonNull
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private Header createHeader()
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
Header.Builder builder = new Header.Builder();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.setStartHeaderAction(Action.BACK);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.setTitle(mBookmarkCategory == null ? getCarContext().getString(R.string.bookmarks) : mBookmarkCategory.getName());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
return builder.build();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@NonNull
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private ItemList createBookmarkCategoriesList()
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final List<BookmarkCategory> bookmarkCategories = getBookmarks();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final int categoriesSize = Math.min(bookmarkCategories.size(), MAX_CATEGORIES_SIZE);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
for (int i = 0; i < categoriesSize; ++i)
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final BookmarkCategory bookmarkCategory = bookmarkCategories.get(i);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
Row.Builder itemBuilder = new Row.Builder();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.setTitle(bookmarkCategory.getName());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.addText(bookmarkCategory.getDescription());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.setOnClickListener(() -> getScreenManager().push(new BookmarksScreen(getCarContext(), getSurfaceRenderer(), bookmarkCategory)));
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.setBrowsable(true);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.addItem(itemBuilder.build());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
return builder.build();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@NonNull
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private ItemList createBookmarksList()
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
rtsisyk
commented
I have this screen working, but taping on a bookmark button does nothing. Is it just not finished yet? I don't see where buttons are connected to any callbacks. I have this screen working, but taping on a bookmark button does nothing. Is it just not finished yet? I don't see where buttons are connected to any callbacks.
AndrewShkrob
commented
Пока я реализовал только отображение. Как и поиск. Полную поддержку можно будет сделать после либо с базовой навигацией. Это нужен отдельный PR. Пока я реализовал только отображение. Как и поиск. Полную поддержку можно будет сделать после либо с базовой навигацией. Это нужен отдельный PR.
rtsisyk
commented
OK OK
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final long bookmarkCategoryId = mBookmarkCategory.getId();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final int bookmarkCategoriesSize = Math.min(mBookmarkCategory.getBookmarksCount(), MAX_CATEGORIES_SIZE);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
for (int i = 0; i < bookmarkCategoriesSize; ++i)
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final long bookmarkId = BookmarkManager.INSTANCE.getBookmarkIdByPosition(bookmarkCategoryId, i);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final BookmarkInfo bookmarkInfo = new BookmarkInfo(bookmarkCategoryId, bookmarkId);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final Row.Builder itemBuilder = new Row.Builder();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.setTitle(bookmarkInfo.getName());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
if (!bookmarkInfo.getAddress().isEmpty())
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.addText(bookmarkInfo.getAddress());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
if (!bookmarkInfo.getFeatureType().isEmpty())
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.addText(bookmarkInfo.getFeatureType());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final Drawable icon = Graphics.drawCircleAndImage(bookmarkInfo.getIcon().argb(),
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
R.dimen.track_circle_size,
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
bookmarkInfo.getIcon().getResId(),
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
R.dimen.bookmark_icon_size,
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
getCarContext());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
itemBuilder.setImage(new CarIcon.Builder(IconCompat.createWithBitmap(Graphics.drawableToBitmap(icon))).build());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
builder.addItem(itemBuilder.build());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
return builder.build();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
@NonNull
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
private static List<BookmarkCategory> getBookmarks()
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final List<BookmarkCategory> bookmarkCategories = new ArrayList<>(BookmarkManager.INSTANCE.getCategories());
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
final List<BookmarkCategory> toRemove = new ArrayList<>();
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
for (BookmarkCategory bookmarkCategory : bookmarkCategories)
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
{
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
if (bookmarkCategory.getBookmarksCount() == 0)
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
toRemove.add(bookmarkCategory);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
bookmarkCategories.removeAll(toRemove);
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
return bookmarkCategories;
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
||||
}
|
||||
rtsisyk
commented
nit: save the service in a temporary variable, just to improve readability of the code. nit: save the service in a temporary variable, just to improve readability of the code.
AndrewShkrob
commented
Да. По-хорошему, как и иконки в PS. Обидно вообще-то 😄![]() Да. По-хорошему, как и иконки в `UiHelper`, надо где-то отдельно хранить, потому что будет часто и много где использоваться.
<details>
<summary>PS. Обидно вообще-то 😄 </summary>
<img width="642" alt="image" src="https://user-images.githubusercontent.com/10351358/206543495-691a97b1-2b73-4d59-9f5a-ba742a112e90.png">
</details>
![]() https://onetwobytes.wordpress.com/2021/11/09/nit-code-review/
![]() ditto ditto
![]() ditto ditto
|
|
@ -0,0 +1,95 @@
|
|||
package app.organicmaps.car.screens;
|
||||
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.constraints.ConstraintManager;
|
||||
import androidx.car.app.model.Action;
|
||||
import androidx.car.app.model.CarIcon;
|
||||
import androidx.car.app.model.Header;
|
||||
import androidx.car.app.model.ItemList;
|
||||
import androidx.car.app.model.Row;
|
||||
import androidx.car.app.model.Template;
|
||||
import androidx.car.app.navigation.model.MapTemplate;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.UiHelpers;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class CategoriesScreen extends MapScreen
|
||||
{
|
||||
private static class CategoryData
|
||||
{
|
||||
@StringRes
|
||||
public final int nameResId;
|
||||
|
||||
@DrawableRes
|
||||
public final int iconResId;
|
||||
|
||||
public CategoryData(int nameResId, int iconResId)
|
||||
{
|
||||
this.nameResId = nameResId;
|
||||
this.iconResId = iconResId;
|
||||
}
|
||||
}
|
||||
|
||||
private static final List<CategoryData> CATEGORIES = Arrays.asList(
|
||||
new CategoryData(R.string.fuel, R.drawable.ic_category_fuel),
|
||||
new CategoryData(R.string.parking, R.drawable.ic_category_parking),
|
||||
new CategoryData(R.string.eat, R.drawable.ic_category_eat),
|
||||
new CategoryData(R.string.food, R.drawable.ic_category_food),
|
||||
new CategoryData(R.string.hotel, R.drawable.ic_category_hotel),
|
||||
new CategoryData(R.string.toilet, R.drawable.ic_category_toilet),
|
||||
new CategoryData(R.string.rv, R.drawable.ic_category_rv)
|
||||
);
|
||||
|
||||
private final int MAX_CATEGORIES_SIZE;
|
||||
|
||||
public CategoriesScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
{
|
||||
super(carContext, surfaceRenderer);
|
||||
final ConstraintManager constraintManager = getCarContext().getCarService(ConstraintManager.class);
|
||||
MAX_CATEGORIES_SIZE = constraintManager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_LIST);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
MapTemplate.Builder builder = new MapTemplate.Builder();
|
||||
builder.setHeader(createHeader());
|
||||
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setActionStrip(UiHelpers.createSettingsActionStrip(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setItemList(createCategoriesList());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Header createHeader()
|
||||
{
|
||||
Header.Builder builder = new Header.Builder();
|
||||
builder.setStartHeaderAction(Action.BACK);
|
||||
builder.setTitle(getCarContext().getString(R.string.categories));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private ItemList createCategoriesList()
|
||||
{
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
int categoriesSize = Math.min(CATEGORIES.size(), MAX_CATEGORIES_SIZE);
|
||||
for (int i = 0; i < categoriesSize; ++i)
|
||||
{
|
||||
Row.Builder itemBuilder = new Row.Builder();
|
||||
itemBuilder.setTitle(getCarContext().getString(CATEGORIES.get(i).nameResId));
|
||||
itemBuilder.setImage(new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), CATEGORIES.get(i).iconResId)).build());
|
||||
builder.addItem(itemBuilder.build());
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
}
|
32
android/src/app/organicmaps/car/screens/ErrorScreen.java
Normal file
|
@ -0,0 +1,32 @@
|
|||
package app.organicmaps.car.screens;
|
||||
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.Screen;
|
||||
import androidx.car.app.model.LongMessageTemplate;
|
||||
import androidx.car.app.model.Template;
|
||||
|
||||
import app.organicmaps.R;
|
||||
|
||||
public class ErrorScreen extends Screen
|
||||
{
|
||||
private static final String TAG = ErrorScreen.class.getSimpleName();
|
||||
|
||||
public ErrorScreen(@NonNull CarContext carContext)
|
||||
{
|
||||
super(carContext);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
Log.d(TAG, "onGetTemplate");
|
||||
LongMessageTemplate.Builder builder = new LongMessageTemplate.Builder(getCarContext().getString(R.string.dialog_error_storage_message));
|
||||
builder.setTitle(getCarContext().getString(R.string.dialog_error_storage_title));
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
}
|
25
android/src/app/organicmaps/car/screens/MapScreen.java
Normal file
|
@ -0,0 +1,25 @@
|
|||
package app.organicmaps.car.screens;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.Screen;
|
||||
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
|
||||
public abstract class MapScreen extends Screen
|
||||
{
|
||||
@NonNull
|
||||
private final SurfaceRenderer mSurfaceRenderer;
|
||||
|
||||
public MapScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
{
|
||||
super(carContext);
|
||||
mSurfaceRenderer = surfaceRenderer;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public SurfaceRenderer getSurfaceRenderer()
|
||||
{
|
||||
return mSurfaceRenderer;
|
||||
}
|
||||
}
|
104
android/src/app/organicmaps/car/screens/NavigationScreen.java
Normal file
|
@ -0,0 +1,104 @@
|
|||
package app.organicmaps.car.screens;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.model.Action;
|
||||
import androidx.car.app.model.CarIcon;
|
||||
import androidx.car.app.model.Header;
|
||||
import androidx.car.app.model.Item;
|
||||
import androidx.car.app.model.ItemList;
|
||||
import androidx.car.app.model.Row;
|
||||
import androidx.car.app.model.Template;
|
||||
import androidx.car.app.navigation.model.MapTemplate;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.UiHelpers;
|
||||
|
||||
public class NavigationScreen extends MapScreen
|
||||
{
|
||||
public NavigationScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
{
|
||||
super(carContext, surfaceRenderer);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
MapTemplate.Builder builder = new MapTemplate.Builder();
|
||||
builder.setHeader(createHeader());
|
||||
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setActionStrip(UiHelpers.createSettingsActionStrip(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setItemList(createList());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Header createHeader()
|
||||
{
|
||||
Header.Builder builder = new Header.Builder();
|
||||
builder.setStartHeaderAction(new Action.Builder(Action.APP_ICON).build());
|
||||
builder.setTitle(getCarContext().getString(R.string.app_name));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private ItemList createList()
|
||||
{
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
builder.addItem(createSearchItem());
|
||||
builder.addItem(createCategoriesItem());
|
||||
builder.addItem(createBookmarksItem());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createSearchItem()
|
||||
{
|
||||
final CarIcon iconSearch = new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_search)).build();
|
||||
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(R.string.search));
|
||||
builder.setImage(iconSearch);
|
||||
builder.setBrowsable(true);
|
||||
builder.setOnClickListener(this::openSearch);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createCategoriesItem()
|
||||
{
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(R.string.categories));
|
||||
builder.setBrowsable(true);
|
||||
builder.setOnClickListener(this::openCategories);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createBookmarksItem()
|
||||
{
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(R.string.bookmarks));
|
||||
builder.setBrowsable(true);
|
||||
builder.setOnClickListener(this::openBookmarks);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
private void openSearch()
|
||||
{
|
||||
getScreenManager().push(new SearchScreen(getCarContext()));
|
||||
}
|
||||
|
||||
private void openCategories()
|
||||
{
|
||||
getScreenManager().push(new CategoriesScreen(getCarContext(), getSurfaceRenderer()));
|
||||
}
|
||||
|
||||
private void openBookmarks()
|
||||
{
|
||||
getScreenManager().push(new BookmarksScreen(getCarContext(), getSurfaceRenderer()));
|
||||
}
|
||||
}
|
62
android/src/app/organicmaps/car/screens/SearchScreen.java
Normal file
|
@ -0,0 +1,62 @@
|
|||
package app.organicmaps.car.screens;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.Screen;
|
||||
import androidx.car.app.constraints.ConstraintManager;
|
||||
import androidx.car.app.model.Action;
|
||||
import androidx.car.app.model.CarIcon;
|
||||
import androidx.car.app.model.ItemList;
|
||||
import androidx.car.app.model.Row;
|
||||
import androidx.car.app.model.SearchTemplate;
|
||||
import androidx.car.app.model.Template;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.search.SearchRecents;
|
||||
|
||||
public class SearchScreen extends Screen implements SearchTemplate.SearchCallback
|
||||
{
|
||||
private final int MAX_RESULTS_SIZE;
|
||||
![]() Почему бы здесь сразу и не инициализировать? Почему бы здесь сразу и не инициализировать?
AndrewShkrob
commented
Нужен Нужен `Context`.
|
||||
private ItemList mResults;
|
||||
![]() А зачем их хранить? А зачем их хранить?
AndrewShkrob
commented
Там будут храниться результаты поискового запроса
Там будут храниться результаты поискового запроса
Логика:
* Вводим запрос в поиске
* Получаем результаты
* Заполняем `mResults`
* Перерисовываем экран
* Отображаем данные из `mResults`
![]() А проще передать данные прямо в отрисовку никак нельзя? А проще передать данные прямо в отрисовку никак нельзя?
AndrewShkrob
commented
Нет. В AA нельзя обновлять данные на экране. Только через перерисовку всего экрана Нет. В AA нельзя обновлять данные на экране. Только через перерисовку всего экрана
rtsisyk
commented
Окей, проблема понятна. Окей, проблема понятна.
|
||||
private String mSearchText = "";
|
||||
|
||||
public SearchScreen(@NonNull CarContext carContext)
|
||||
{
|
||||
super(carContext);
|
||||
final ConstraintManager constraintManager = getCarContext().getCarService(ConstraintManager.class);
|
||||
MAX_RESULTS_SIZE = constraintManager.getContentLimit(ConstraintManager.CONTENT_LIMIT_TYPE_LIST);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
SearchTemplate.Builder builder = new SearchTemplate.Builder(this);
|
||||
builder.setHeaderAction(Action.BACK);
|
||||
builder.setShowKeyboardByDefault(false);
|
||||
if (mSearchText.isEmpty() || mResults == null)
|
||||
loadRecents();
|
||||
builder.setItemList(mResults);
|
||||
builder.setInitialSearchText(mSearchText);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
private void loadRecents()
|
||||
{
|
||||
final CarIcon iconRecent = new CarIcon.Builder(IconCompat.createWithResource(getCarContext(), R.drawable.ic_search_recent)).build();
|
||||
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
builder.setNoItemsMessage(getCarContext().getString(R.string.search_history_text));
|
||||
SearchRecents.refresh();
|
||||
int recentsSize = Math.min(SearchRecents.getSize(), MAX_RESULTS_SIZE);
|
||||
for (int i = 0; i < recentsSize; ++i)
|
||||
{
|
||||
Row.Builder itemBuilder = new Row.Builder();
|
||||
itemBuilder.setTitle(SearchRecents.get(i));
|
||||
itemBuilder.setImage(iconRecent);
|
||||
builder.addItem(itemBuilder.build());
|
||||
}
|
||||
mResults = builder.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
package app.organicmaps.car.screens.settings;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.model.Action;
|
||||
import androidx.car.app.model.CarIcon;
|
||||
import androidx.car.app.model.Header;
|
||||
import androidx.car.app.model.ItemList;
|
||||
import androidx.car.app.model.Row;
|
||||
import androidx.car.app.model.Template;
|
||||
import androidx.car.app.navigation.model.MapTemplate;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.UiHelpers;
|
||||
import app.organicmaps.car.screens.MapScreen;
|
||||
import app.organicmaps.routing.RoutingOptions;
|
||||
import app.organicmaps.settings.RoadType;
|
||||
|
||||
public class DrivingOptionsScreen extends MapScreen
|
||||
{
|
||||
@NonNull
|
||||
private final CarIcon mCheckboxIcon;
|
||||
@NonNull
|
||||
private final CarIcon mCheckboxSelectedIcon;
|
||||
|
||||
public DrivingOptionsScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
{
|
||||
super(carContext, surfaceRenderer);
|
||||
mCheckboxIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box)).build();
|
||||
mCheckboxSelectedIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box_checked)).build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
MapTemplate.Builder builder = new MapTemplate.Builder();
|
||||
builder.setHeader(createHeader());
|
||||
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setItemList(createDrivingOptionsList());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Header createHeader()
|
||||
{
|
||||
Header.Builder builder = new Header.Builder();
|
||||
builder.setStartHeaderAction(Action.BACK);
|
||||
builder.setTitle(getCarContext().getString(R.string.driving_options_subheader));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private ItemList createDrivingOptionsList()
|
||||
{
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
builder.addItem(createDrivingOptionCheckbox(RoadType.Toll, R.string.avoid_tolls));
|
||||
builder.addItem(createDrivingOptionCheckbox(RoadType.Dirty, R.string.avoid_unpaved));
|
||||
builder.addItem(createDrivingOptionCheckbox(RoadType.Ferry, R.string.avoid_ferry));
|
||||
builder.addItem(createDrivingOptionCheckbox(RoadType.Motorway, R.string.avoid_motorways));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Row createDrivingOptionCheckbox(RoadType roadType, @StringRes int titleRes)
|
||||
{
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(titleRes));
|
||||
builder.setOnClickListener(() -> {
|
||||
if (RoutingOptions.hasOption(roadType))
|
||||
RoutingOptions.removeOption(roadType);
|
||||
else
|
||||
RoutingOptions.addOption(roadType);
|
||||
DrivingOptionsScreen.this.invalidate();
|
||||
});
|
||||
builder.setImage(RoutingOptions.hasOption(roadType) ? mCheckboxSelectedIcon : mCheckboxIcon);
|
||||
return builder.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package app.organicmaps.car.screens.settings;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.model.Action;
|
||||
import androidx.car.app.model.Header;
|
||||
import androidx.car.app.model.Item;
|
||||
import androidx.car.app.model.ItemList;
|
||||
import androidx.car.app.model.Row;
|
||||
import androidx.car.app.model.Template;
|
||||
import androidx.car.app.navigation.model.MapTemplate;
|
||||
|
||||
import app.organicmaps.BuildConfig;
|
||||
import app.organicmaps.Framework;
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.UiHelpers;
|
||||
import app.organicmaps.car.screens.MapScreen;
|
||||
import app.organicmaps.util.DateUtils;
|
||||
|
||||
public class HelpScreen extends MapScreen
|
||||
{
|
||||
public HelpScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
{
|
||||
super(carContext, surfaceRenderer);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
MapTemplate.Builder builder = new MapTemplate.Builder();
|
||||
builder.setHeader(createHeader());
|
||||
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setItemList(createSettingsList());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Header createHeader()
|
||||
{
|
||||
Header.Builder builder = new Header.Builder();
|
||||
builder.setStartHeaderAction(Action.BACK);
|
||||
builder.setTitle(getCarContext().getString(R.string.help));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private ItemList createSettingsList()
|
||||
{
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
builder.addItem(createVersionInfo());
|
||||
builder.addItem(createDataVersionInfo());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createVersionInfo()
|
||||
{
|
||||
return new Row.Builder()
|
||||
.setTitle(getCarContext().getString(R.string.app_name))
|
||||
.addText(BuildConfig.VERSION_NAME)
|
||||
.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createDataVersionInfo()
|
||||
{
|
||||
return new Row.Builder()
|
||||
.setTitle(getCarContext().getString(R.string.data_version, ""))
|
||||
![]() Заголовок пустой? Заголовок пустой?
AndrewShkrob
commented
Нет. Нет.
В `R.string.data_version` лежит `<string name="data_version">OpenStreetMap data: %s</string>`.
Вместо `%s` подставляется пустая строка.
На экране:

|
||||
.addText(DateUtils.getLocalDate(Framework.nativeGetDataVersion()))
|
||||
.build();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
package app.organicmaps.car.screens.settings;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.car.app.CarContext;
|
||||
import androidx.car.app.model.Action;
|
||||
import androidx.car.app.model.CarIcon;
|
||||
import androidx.car.app.model.Header;
|
||||
import androidx.car.app.model.Item;
|
||||
import androidx.car.app.model.ItemList;
|
||||
import androidx.car.app.model.Row;
|
||||
import androidx.car.app.model.Template;
|
||||
import androidx.car.app.navigation.model.MapTemplate;
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
|
||||
import app.organicmaps.R;
|
||||
import app.organicmaps.car.SurfaceRenderer;
|
||||
import app.organicmaps.car.UiHelpers;
|
||||
import app.organicmaps.car.screens.MapScreen;
|
||||
import app.organicmaps.util.Config;
|
||||
|
||||
public class SettingsScreen extends MapScreen
|
||||
{
|
||||
private interface PrefsGetter
|
||||
{
|
||||
boolean get();
|
||||
}
|
||||
|
||||
private interface PrefsSetter
|
||||
{
|
||||
void set(boolean newValue);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private final CarIcon mCheckboxIcon;
|
||||
@NonNull
|
||||
private final CarIcon mCheckboxSelectedIcon;
|
||||
|
||||
public SettingsScreen(@NonNull CarContext carContext, @NonNull SurfaceRenderer surfaceRenderer)
|
||||
{
|
||||
super(carContext, surfaceRenderer);
|
||||
mCheckboxIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box)).build();
|
||||
mCheckboxSelectedIcon = new CarIcon.Builder(IconCompat.createWithResource(carContext, R.drawable.ic_check_box_checked)).build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Template onGetTemplate()
|
||||
{
|
||||
MapTemplate.Builder builder = new MapTemplate.Builder();
|
||||
builder.setHeader(createHeader());
|
||||
builder.setMapController(UiHelpers.createMapController(getCarContext(), getSurfaceRenderer()));
|
||||
builder.setItemList(createSettingsList());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Header createHeader()
|
||||
{
|
||||
Header.Builder builder = new Header.Builder();
|
||||
builder.setStartHeaderAction(Action.BACK);
|
||||
builder.setTitle(getCarContext().getString(R.string.settings));
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private ItemList createSettingsList()
|
||||
{
|
||||
ItemList.Builder builder = new ItemList.Builder();
|
||||
builder.addItem(createRoutingOptionsItem());
|
||||
builder.addItem(createSharedPrefsCheckbox(R.string.big_font, Config::isLargeFontsSize, Config::setLargeFontsSize));
|
||||
builder.addItem(createSharedPrefsCheckbox(R.string.transliteration_title, Config::isTransliteration, Config::setTransliteration));
|
||||
builder.addItem(createHelpItem());
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createRoutingOptionsItem()
|
||||
{
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(R.string.driving_options_title));
|
||||
builder.setOnClickListener(() -> getScreenManager().push(new DrivingOptionsScreen(getCarContext(), getSurfaceRenderer())));
|
||||
builder.setBrowsable(true);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Item createHelpItem()
|
||||
{
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(R.string.help));
|
||||
builder.setOnClickListener(() -> getScreenManager().push(new HelpScreen(getCarContext(), getSurfaceRenderer())));
|
||||
builder.setBrowsable(true);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Row createSharedPrefsCheckbox(@StringRes int titleRes, PrefsGetter getter, PrefsSetter setter)
|
||||
{
|
||||
final boolean getterValue = getter.get();
|
||||
|
||||
Row.Builder builder = new Row.Builder();
|
||||
builder.setTitle(getCarContext().getString(titleRes));
|
||||
builder.setOnClickListener(() -> {
|
||||
setter.set(!getterValue);
|
||||
SettingsScreen.this.invalidate();
|
||||
});
|
||||
builder.setImage(getterValue ? mCheckboxSelectedIcon : mCheckboxIcon);
|
||||
return builder.build();
|
||||
}
|
||||
}
|
What are potential security implications here?