Внедрение GoogleApiClient на Android mvp с использованием кинжала?

есть пара вопросов, которые у меня есть,

во-первых, когда я прочитал некоторые статьи, я должен реализовать интерфейсы LocationListener, ConnectionCallback, OnConnectionFailedListener в активности,

правильно ли разделять реализацию этих классов в разных файлах?

как показано ниже?

public class LocationListener implements 
           com.google.android.gms.location.LocationListener {
@Inject
Location mLastLocation;
@Override
public void onLocationChanged(Location location) {
    // Assign the new location
    mLastLocation = location;
    // Displaying the new location on UI
 }
}

Это правильно в моей деятельности, которую я обрабатываю Отображение свойств mLastLocation?

//Fields
@Inject
GoogleApiClient client;
Location mLastLocation;
//Fields
  mLastLocation = LocationServices.FusedLocationApi.getLastLocation(client);

second, Как мне написать метод провайдера для этого?. Мое предположение будет таким, что вы, ребята, порекомендуете?

//Constructor
public LocationModule(Context context, GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
    this.context = context;
    this.callback = callback;
    this.listener = listener;
}
@Provides
@Singleton
GoogleApiClient providesGoogleApi() {
    return new GoogleApiClient.Builder(context)
            .addOnConnectionFailedListener(listener)
            .addConnectionCallbacks(callback)
            .addApi(LocationServices.API)
            .build();
}

и, наконец, , где я должен обрабатывать разрешения для устройств Android и выше?, есть ли это на представлении или на презентаторе?

Я слышал, что представление должно быть настолько глупо, что вам не нужно его проверять, как я должен соблюдать этот принцип?

Если кто-нибудь может дать мне ссылку, или пример кода github, который соответствует моему случаю, который будет настолько велик.

Ответ 1

Прежде всего, вы можете думать о уровне представления MVP как о чистом модуле Android, что означает, что любая связь с операционной системой Android, например, с запросом разрешения, должна обрабатываться с использованием этого уровня, и результат возвращается к ведущему, который решает, что делать следующий.

О разделении реализации этого класса я сам хочу выделить классы для более чистой визуализации, когда я ищу некоторый код класса! Я не думаю, что кто-то может предложить лучшую практику, потому что это зависит от вашего модуля и реализации. Согласно книге "Чистый код", в таких ситуациях принятия решений вам нужно больше думать о своей читаемости кода.

Наконец, о LocationModule, это абсолютно правильно, но если бы я был в ваших силах, я бы даже попросил контекст на более высоком уровне Компонент (например, ApplicationComponent) и удалить его из конструктора LocationModule.

//Constructor
public LocationModule(GoogleApiClient.ConnectionCallbacks callback, GoogleApiClient.OnConnectionFailedListener listener) {
    this.callback = callback;
    this.listener = listener;
}

@Provides
@Singleton
GoogleApiClient providesGoogleApi(Context context) {
    return new GoogleApiClient.Builder(context)
            .addOnConnectionFailedListener(listener)
            .addConnectionCallbacks(callback)
            .addApi(LocationServices.API)
            .build();
}

Контекст может быть предоставлен с использованием соответствующего поставщика в более высоком модуле.

Вот пример репо, который действительно может помочь вам в этом отношении:

https://github.com/mmirhoseini/fyber_mobile_offers