October 14, 2020

Расстояние автозахвата

Функция изменения расстояния автозахвата реализуется путем добавления нескольких иплантов в приложение.

Диалог изменения расстояния

Для того чтобы изменять расстояние автозахвата, необходимо это значение где-то хранить и изменять. Отличным решением являются встроенные настройки приложения.

Находим разметку экрана фильтров, и вставляем новый пункт настроек:

Код диалога (выделен желтым) и его ID (выделен зеленым)

<EditTextPreference android:singleLine="true" android:selectAllOnFocus="true" android:title="Радиус автозахвата" android:key="svolf_radius" android:summary="Пытается переопределить радиус автозахвата, отдаваемый сервером (1500) на заданный пользователем" android:defaultValue="5000" android:inputType="phone" />

Теперь можно обращаться к данным, которые будут записаны через этот диалог с помощью ключа svolf_radius

Обращение к настройкам из кода

Диалог создан. Туда можно что-то записать, но теперь необходимо подготовить приложение к взаимодействию с ним.

Необходимо немного подредачить Application класс, для того чтобы иметь доступ к экземпляру настроек из любого места

Для этого, в код com/pk/taxoid/app/Application добавляем метод getPrefrences() который творит магию.

Код в smali:

.method public getPrefrences()Landroid/content/SharedPreferences; .locals 1

invoke-static {p0}, Landroid/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;

move-result-object v0

return-object v0 .end method

Как найти где и что заменить

Расстояние автозахвата определяется некой переменной. Чтоб заменить ее значение на то, которое нам нужно, необходимо найти ее.

Т.к. каждый заказ является объектом типа com.pk.taxoid.models.standart.Order то и искать будем там же.

Возможность захватить заказ проверяется из метода isCanGetByAutoLock()

Путем нехитрых манипуляций, выясняется, что расстояние приходит из соседнего метода isCanGetAutoLock, а тому в свою очередь, через метод f() класса com.pk.taxoid.app.b

Дело за малым - заменить в нем метод f() на наш, уже поправленный.

Слева - оригинал. Справа - мод.

В smali это будет выглядеть так

com/pk/taxoid/app/b.smali

метод:

.method public f()I .locals 1

iget v0, p0, Lcom/pk/taxoid/app/b;->k:I

return v0 .end method

привести к виду:

.method public f()I .locals 3

.line 5 invoke-static {}, Lcom/pk/taxoid/app/Application;->f()Lcom/pk/taxoid/app/Application;

move-result-object v0

invoke-virtual {v0}, Lcom/pk/taxoid/app/Application;->getPrefrences()Landroid/content/SharedPreferences;

move-result-object v0

const-string v1, "svolf_radius"

const-string v2, "5000"

invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

move-result-object v0

invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I

move-result v0

return v0 .end method

Итог