Ich habe App mit Subcomponent
s wie dieseDagger 2 Modul außer Kraft setzen in Subkomponente
-------- ApplicationComponent ------------
| |
| |
| |
Service Component Activity Component
|
|
|
Fragment Component
Alles funktioniert gut, aber ich möchte eine Sache tun.
Android M requires runtime permissions so I decided to create
-Controller , something like helper class that will be injected into
Fragment or
Activity` Common Interface
public interface PermissionController {
boolean hasPermissionInManifest(String permissionName);
boolean isPermissionGranted(String permission);
/**
* Request permission for Android 6
*
* @param permission permission that is requested
* @param requestCode request code
* @return if user is going to be asked about permission so we need to handle callback, otherwise
* user was already asked or permission is not required cause of android lower version
*/
boolean requestPermission(int requestCode, String permission);
void requestPermissions(int requestCode, String... permissions);
}
Und eine Methode aus verschiedenen Implementierungen PermissionActivityManager
und PermissionFragmentManager
@Override
public boolean requestPermission(int requestCode, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (mContext.checkSelfPermission(permission)
!= PackageManager.PERMISSION_GRANTED) {
mContext.requestPermissions(new String[]{permission},
requestCode);
return true;
}
}
return false;
}
Und Fragment
Implementierung
@Override
public boolean requestPermission(int requestCode, String permission) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(mFragment.getActivity(), permission)
!= PackageManager.PERMISSION_GRANTED) {
mFragment.requestPermissions(new String[]{permission},
requestCode);
return true;
}
}
return false;
}
Hoffnung y Du hast eine Idee.
Aber über das Problem, mein FragmentComponent
ist Subkomponente von ActivityComponent
beide Sie haben PermissionModule
@PerActivity
@Subcomponent(
modules = {
ActivityModule.class,
PermissionModule.class
})
public interface ActivityComponent {
Activity activity();
FragmentComponent fragmentComponent(FragmentModule module);
void inject(BaseActivity baseActivity);
void inject(MainAppActivity mainAppActivity);
}
Und für Fragment
@Subcomponent(
modules = {
FragmentModule.class,
ProviderModule.class,
PermissionModule.class
})
@PerFragment
public interface FragmentComponent {
Fragment fragment();
void inject(BaseFragment baseFragment);
}
und Module sind die gleichen, außer Anmerkungen und zurück Instanzen .
@PerFragment
@Module
public class PermissionModule {
@PerFragment
@Provides
PermissionController providePermissionController(Fragment fragment) {
return new PermissionFragmentManager(fragment);
}
}
@PerActivity
@Module
public class PermissionModule {
@PerActivity
@Provides
PermissionController providePermissionController(Activity activity) {
return new PermissionActivityManager(activity);
}
}
Also meine Frage ist - wenn es eine Möglichkeit ist provide
Methode in übergeordneter Komponente außer Kraft zu setzen oder es gibt einen anderen Weg, um das Problem zu lösen? Weil in meinem Fall PermissionActivityManager
injiziert wurde.
Danke für die Antwort, ich habe das gleiche wie Sie gestern vorgeschlagen, funktioniert gut – CROSP