3333
3434public class RxPermissions {
3535
36- static final String TAG = " RxPermissions" ;
36+ static final String TAG = RxPermissions . class . getSimpleName () ;
3737 static final Object TRIGGER = new Object ();
3838
39- RxPermissionsFragment mRxPermissionsFragment ;
39+ private final Lazy < RxPermissionsFragment > mRxPermissionsFragment ;
4040
41- public RxPermissions (@ NonNull FragmentActivity activity ) {
42- mRxPermissionsFragment = getRxPermissionsFragment (activity );
41+ public RxPermissions (@ NonNull final FragmentActivity activity ) {
42+ mRxPermissionsFragment = getLazySingleton (activity );
43+ }
44+
45+ @ NonNull
46+ private Lazy <RxPermissionsFragment > getLazySingleton (@ NonNull final FragmentActivity activity ) {
47+ return new Lazy <RxPermissionsFragment >() {
48+
49+ private RxPermissionsFragment rxPermissionsFragment ;
50+
51+ @ Override
52+ public synchronized RxPermissionsFragment get () {
53+ if (rxPermissionsFragment == null ) {
54+ rxPermissionsFragment = getRxPermissionsFragment (activity );
55+ }
56+ return rxPermissionsFragment ;
57+ }
58+
59+ };
4360 }
4461
4562 private RxPermissionsFragment getRxPermissionsFragment (@ NonNull FragmentActivity activity ) {
@@ -51,8 +68,7 @@ private RxPermissionsFragment getRxPermissionsFragment(@NonNull FragmentActivity
5168 fragmentManager
5269 .beginTransaction ()
5370 .add (rxPermissionsFragment , TAG )
54- .commitAllowingStateLoss ();
55- fragmentManager .executePendingTransactions ();
71+ .commitNow ();
5672 }
5773 return rxPermissionsFragment ;
5874 }
@@ -62,7 +78,7 @@ private RxPermissionsFragment findRxPermissionsFragment(@NonNull FragmentActivit
6278 }
6379
6480 public void setLogging (boolean logging ) {
65- mRxPermissionsFragment .setLogging (logging );
81+ mRxPermissionsFragment .get (). setLogging (logging );
6682 }
6783
6884 /**
@@ -186,7 +202,7 @@ public Observable<Permission> apply(Object o) {
186202
187203 private Observable <?> pending (final String ... permissions ) {
188204 for (String p : permissions ) {
189- if (!mRxPermissionsFragment .containsByPermission (p )) {
205+ if (!mRxPermissionsFragment .get (). containsByPermission (p )) {
190206 return Observable .empty ();
191207 }
192208 }
@@ -208,7 +224,7 @@ private Observable<Permission> requestImplementation(final String... permissions
208224 // In case of multiple permissions, we create an Observable for each of them.
209225 // At the end, the observables are combined to have a unique response.
210226 for (String permission : permissions ) {
211- mRxPermissionsFragment .log ("Requesting permission " + permission );
227+ mRxPermissionsFragment .get (). log ("Requesting permission " + permission );
212228 if (isGranted (permission )) {
213229 // Already granted, or not Android M
214230 // Return a granted Permission object.
@@ -222,12 +238,12 @@ private Observable<Permission> requestImplementation(final String... permissions
222238 continue ;
223239 }
224240
225- PublishSubject <Permission > subject = mRxPermissionsFragment .getSubjectByPermission (permission );
241+ PublishSubject <Permission > subject = mRxPermissionsFragment .get (). getSubjectByPermission (permission );
226242 // Create a new subject if not exists
227243 if (subject == null ) {
228244 unrequestedPermissions .add (permission );
229245 subject = PublishSubject .create ();
230- mRxPermissionsFragment .setSubjectForPermission (permission , subject );
246+ mRxPermissionsFragment .get (). setSubjectForPermission (permission , subject );
231247 }
232248
233249 list .add (subject );
@@ -272,8 +288,8 @@ private boolean shouldShowRequestPermissionRationaleImplementation(final Activit
272288
273289 @ TargetApi (Build .VERSION_CODES .M )
274290 void requestPermissionsFromFragment (String [] permissions ) {
275- mRxPermissionsFragment .log ("requestPermissionsFromFragment " + TextUtils .join (", " , permissions ));
276- mRxPermissionsFragment .requestPermissions (permissions );
291+ mRxPermissionsFragment .get (). log ("requestPermissionsFromFragment " + TextUtils .join (", " , permissions ));
292+ mRxPermissionsFragment .get (). requestPermissions (permissions );
277293 }
278294
279295 /**
@@ -283,7 +299,7 @@ void requestPermissionsFromFragment(String[] permissions) {
283299 */
284300 @ SuppressWarnings ("WeakerAccess" )
285301 public boolean isGranted (String permission ) {
286- return !isMarshmallow () || mRxPermissionsFragment .isGranted (permission );
302+ return !isMarshmallow () || mRxPermissionsFragment .get (). isGranted (permission );
287303 }
288304
289305 /**
@@ -293,15 +309,20 @@ public boolean isGranted(String permission) {
293309 */
294310 @ SuppressWarnings ("WeakerAccess" )
295311 public boolean isRevoked (String permission ) {
296- return isMarshmallow () && mRxPermissionsFragment .isRevoked (permission );
312+ return isMarshmallow () && mRxPermissionsFragment .get (). isRevoked (permission );
297313 }
298314
299315 boolean isMarshmallow () {
300316 return Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ;
301317 }
302318
303319 void onRequestPermissionsResult (String permissions [], int [] grantResults ) {
304- mRxPermissionsFragment .onRequestPermissionsResult (permissions , grantResults , new boolean [permissions .length ]);
320+ mRxPermissionsFragment .get ().onRequestPermissionsResult (permissions , grantResults , new boolean [permissions .length ]);
321+ }
322+
323+ @ FunctionalInterface
324+ public interface Lazy <V > {
325+ V get ();
305326 }
306327
307328}
0 commit comments