Расстояние автозахвата
Функция изменения расстояния автозахвата реализуется путем добавления нескольких иплантов в приложение.
Диалог изменения расстояния
Для того чтобы изменять расстояние автозахвата, необходимо это значение где-то хранить и изменять. Отличным решением являются встроенные настройки приложения.
Находим разметку экрана фильтров, и вставляем новый пункт настроек:
<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