Skip to content

Commit 9d98ed1

Browse files
committed
Merge branch 'fix_scope'
* fix_scope: Fix Console module disabled robolectric Snackbar tests Add retry and StateManager Fix Scope issue Fix scope issue # Conflicts: # app/src/test/java/com/mirhoseini/marvel/activity/MainActivityRobolectricTest.java
2 parents bdd6cbb + e3403cd commit 9d98ed1

37 files changed

+497
-380
lines changed

app/src/main/java/com/mirhoseini/marvel/AndroidModule.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.mirhoseini.marvel;
22

33
import android.content.Context;
4-
import android.content.SharedPreferences;
54
import android.content.res.Resources;
6-
import android.preference.PreferenceManager;
75

86
import javax.inject.Singleton;
97

app/src/main/java/com/mirhoseini/marvel/ApplicationComponent.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import com.mirhoseini.marvel.activity.CharacterActivity;
44
import com.mirhoseini.marvel.activity.MainActivity;
55
import com.mirhoseini.marvel.activity.SplashActivity;
6-
import com.mirhoseini.marvel.character.cache.AppCacheModule;
6+
import com.mirhoseini.marvel.character.cache.CacheModule;
77
import com.mirhoseini.marvel.character.cache.CacheSubComponent;
8-
import com.mirhoseini.marvel.character.search.AppSearchModule;
8+
import com.mirhoseini.marvel.character.search.SearchModule;
99
import com.mirhoseini.marvel.character.search.SearchSubComponent;
1010
import com.mirhoseini.marvel.database.DatabaseModule;
1111
import com.mirhoseini.marvel.domain.ApiModule;
@@ -35,8 +35,8 @@ public interface ApplicationComponent {
3535

3636
void inject(CharacterActivity characterActivity);
3737

38-
SearchSubComponent plus(AppSearchModule module);
38+
SearchSubComponent plus(SearchModule module);
3939

40-
CacheSubComponent plus(AppCacheModule module);
40+
CacheSubComponent plus(CacheModule module);
4141

4242
}

app/src/main/java/com/mirhoseini/marvel/ApplicationModule.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@
22

33
import android.content.Context;
44

5+
import com.google.firebase.analytics.FirebaseAnalytics;
6+
import com.mirhoseini.marvel.util.AppConstants;
57
import com.mirhoseini.marvel.util.AppSchedulerProvider;
68
import com.mirhoseini.marvel.util.Constants;
79
import com.mirhoseini.marvel.util.SchedulerProvider;
10+
import com.mirhoseini.marvel.util.StateManager;
11+
import com.mirhoseini.marvel.util.StateManagerImpl;
812
import com.mirhoseini.utils.Utils;
913

1014
import java.io.File;
@@ -33,7 +37,7 @@ boolean provideIsDebug() {
3337
@Singleton
3438
@Named("networkTimeoutInSeconds")
3539
int provideNetworkTimeoutInSeconds() {
36-
return Constants.NETWORK_CONNECTION_TIMEOUT;
40+
return AppConstants.NETWORK_CONNECTION_TIMEOUT;
3741
}
3842

3943
@Provides
@@ -52,21 +56,28 @@ SchedulerProvider provideAppScheduler() {
5256
@Singleton
5357
@Named("cacheSize")
5458
long provideCacheSize() {
55-
return Constants.CACHE_SIZE;
59+
return AppConstants.CACHE_SIZE;
5660
}
5761

5862
@Provides
5963
@Singleton
6064
@Named("cacheMaxAge")
6165
int provideCacheMaxAgeMinutes() {
62-
return Constants.CACHE_MAX_AGE;
66+
return AppConstants.CACHE_MAX_AGE;
6367
}
6468

6569
@Provides
6670
@Singleton
6771
@Named("cacheMaxStale")
6872
int provideCacheMaxStaleDays() {
69-
return Constants.CACHE_MAX_STALE;
73+
return AppConstants.CACHE_MAX_STALE;
74+
}
75+
76+
@Provides
77+
@Singleton
78+
@Named("retryCount")
79+
public int provideApiRetryCount() {
80+
return AppConstants.API_RETRY_COUNT;
7081
}
7182

7283
@Provides
@@ -82,4 +93,14 @@ boolean provideIsConnect(Context context) {
8293
return Utils.isConnected(context);
8394
}
8495

96+
@Provides
97+
FirebaseAnalytics provideFirebaseAnalytics(Context context) {
98+
return FirebaseAnalytics.getInstance(context);
99+
}
100+
101+
@Provides
102+
@Singleton
103+
public StateManager provideStateManager(StateManagerImpl stateManager) {
104+
return stateManager;
105+
}
85106
}

app/src/main/java/com/mirhoseini/marvel/MarvelApplication.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package com.mirhoseini.marvel;
22

33
import android.app.Application;
4+
import android.content.Context;
5+
6+
import com.mirhoseini.marvel.character.cache.CacheModule;
7+
import com.mirhoseini.marvel.character.cache.CacheSubComponent;
8+
import com.mirhoseini.marvel.character.search.SearchModule;
9+
import com.mirhoseini.marvel.character.search.SearchSubComponent;
410

511
/**
612
* Created by Mohsen on 20/10/2016.
@@ -9,11 +15,49 @@
915
public abstract class MarvelApplication extends Application {
1016

1117
private static ApplicationComponent component;
18+
private CacheSubComponent cacheSubComponent;
19+
private SearchSubComponent searchSubComponent;
1220

1321
public static ApplicationComponent getComponent() {
1422
return component;
1523
}
1624

25+
public static MarvelApplication get(Context context) {
26+
return (MarvelApplication) context.getApplicationContext();
27+
}
28+
29+
public CacheSubComponent getCacheSubComponent() {
30+
if (null == cacheSubComponent)
31+
createCacheSubComponent();
32+
33+
return cacheSubComponent;
34+
}
35+
36+
public CacheSubComponent createCacheSubComponent() {
37+
cacheSubComponent = component.plus(new CacheModule());
38+
return cacheSubComponent;
39+
}
40+
41+
public void releaseCacheSubComponent() {
42+
cacheSubComponent = null;
43+
}
44+
45+
public SearchSubComponent getSearchSubComponent() {
46+
if (null == searchSubComponent)
47+
createSearchSubComponent();
48+
49+
return searchSubComponent;
50+
}
51+
52+
public SearchSubComponent createSearchSubComponent() {
53+
searchSubComponent = component.plus(new SearchModule());
54+
return searchSubComponent;
55+
}
56+
57+
public void releaseSearchSubComponent() {
58+
searchSubComponent = null;
59+
}
60+
1761
@Override
1862
public void onCreate() {
1963
super.onCreate();

app/src/main/java/com/mirhoseini/marvel/activity/CharacterActivity.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import com.mirhoseini.marvel.ApplicationComponent;
1111
import com.mirhoseini.marvel.BR;
12+
import com.mirhoseini.marvel.MarvelApplication;
1213
import com.mirhoseini.marvel.R;
1314
import com.mirhoseini.marvel.base.BaseActivity;
1415
import com.mirhoseini.marvel.database.model.CharacterModel;
@@ -55,6 +56,11 @@ protected void onCreate(Bundle savedInstanceState) {
5556
Timber.d("Character Activity Created");
5657
}
5758

59+
@Override
60+
protected void injectDependencies(MarvelApplication application, ApplicationComponent component) {
61+
component.inject(this);
62+
}
63+
5864
private void setupToolbar(String characterName) {
5965
setSupportActionBar(toolbar);
6066
toolbar.setNavigationIcon(R.drawable.logo);
@@ -63,8 +69,8 @@ private void setupToolbar(String characterName) {
6369
}
6470

6571
@Override
66-
protected void injectDependencies(ApplicationComponent component) {
67-
component.inject(this);
72+
protected void releaseSubComponents(MarvelApplication application) {
73+
6874
}
6975

7076
}

app/src/main/java/com/mirhoseini/marvel/activity/MainActivity.java

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.content.Context;
44
import android.content.Intent;
5-
import android.content.res.Resources;
65
import android.graphics.Color;
76
import android.os.Bundle;
87
import android.provider.Settings;
@@ -12,43 +11,45 @@
1211
import android.widget.Toast;
1312

1413
import com.mirhoseini.marvel.ApplicationComponent;
14+
import com.mirhoseini.marvel.MarvelApplication;
1515
import com.mirhoseini.marvel.R;
1616
import com.mirhoseini.marvel.base.BaseActivity;
17-
import com.mirhoseini.marvel.character.cache.CharacterCacheFragment;
18-
import com.mirhoseini.marvel.character.search.CharacterSearchFragment;
17+
import com.mirhoseini.marvel.character.cache.CacheFragment;
18+
import com.mirhoseini.marvel.character.search.SearchFragment;
1919
import com.mirhoseini.marvel.database.model.CharacterModel;
2020

2121
import javax.inject.Inject;
2222

2323
import butterknife.BindView;
2424
import butterknife.ButterKnife;
25+
import rx.subscriptions.CompositeSubscription;
2526
import timber.log.Timber;
2627

2728
/**
2829
* Created by Mohsen on 20/10/2016.
2930
*/
3031

31-
public class MainActivity extends BaseActivity implements CharacterSearchFragment.OnListFragmentInteractionListener, CharacterCacheFragment.OnListFragmentInteractionListener {
32+
public class MainActivity extends BaseActivity {
3233

3334
public static final String TAG_SEARCH_FRAGMENT = "search_fragment";
3435
public static final String TAG_CACHE_FRAGMENT = "cache_fragment";
3536

3637
// injecting dependencies via Dagger
3738
@Inject
3839
Context context;
39-
@Inject
40-
Resources resources;
4140

4241
// injecting views via ButterKnife
4342
@BindView(R.id.toolbar)
4443
Toolbar toolbar;
4544

46-
private CharacterSearchFragment searchFragment;
47-
private CharacterCacheFragment cacheFragment;
45+
CompositeSubscription subscriptions;
46+
private SearchFragment searchFragment;
47+
private CacheFragment cacheFragment;
4848

4949
@Override
5050
protected void onCreate(Bundle savedInstanceState) {
5151
super.onCreate(savedInstanceState);
52+
5253
setContentView(R.layout.activity_main);
5354

5455
// inject views using ButterKnife
@@ -57,19 +58,19 @@ protected void onCreate(Bundle savedInstanceState) {
5758
setupToolbar();
5859

5960
if (null == savedInstanceState) {
60-
searchFragment = CharacterSearchFragment.newInstance();
61-
cacheFragment = CharacterCacheFragment.newInstance();
61+
searchFragment = SearchFragment.newInstance();
62+
cacheFragment = CacheFragment.newInstance();
6263
attachFragments();
6364
} else {
64-
searchFragment = (CharacterSearchFragment) getSupportFragmentManager().findFragmentByTag(TAG_SEARCH_FRAGMENT);
65-
cacheFragment = (CharacterCacheFragment) getSupportFragmentManager().findFragmentByTag(TAG_CACHE_FRAGMENT);
65+
searchFragment = (SearchFragment) getSupportFragmentManager().findFragmentByTag(TAG_SEARCH_FRAGMENT);
66+
cacheFragment = (CacheFragment) getSupportFragmentManager().findFragmentByTag(TAG_CACHE_FRAGMENT);
6667
}
6768

6869
Timber.d("Main Activity Created");
6970
}
7071

7172
@Override
72-
protected void injectDependencies(ApplicationComponent component) {
73+
protected void injectDependencies(MarvelApplication application, ApplicationComponent component) {
7374
component.inject(this);
7475
}
7576

@@ -87,27 +88,59 @@ private void attachFragments() {
8788
}
8889

8990
@Override
91+
protected void onResume() {
92+
super.onResume();
93+
94+
if (null == subscriptions || subscriptions.isUnsubscribed())
95+
subscriptions = new CompositeSubscription();
96+
97+
subscriptions.addAll(
98+
searchFragment.characterObservable()
99+
.subscribe(this::showCharacter),
100+
searchFragment.messageObservable()
101+
.subscribe(this::showMessage),
102+
searchFragment.offlineObservable()
103+
.subscribe(this::showOfflineMessage),
104+
cacheFragment.characterObservable()
105+
.subscribe(this::showCharacter),
106+
cacheFragment.messageObservable()
107+
.subscribe(this::showMessage),
108+
cacheFragment.offlineObservable()
109+
.subscribe(this::showOfflineMessage)
110+
);
111+
}
112+
90113
public void showMessage(String message) {
91114
Timber.d("Showing Message: %s", message);
92115

93116
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
94117
}
95118

96-
@Override
97-
public void showOfflineMessage() {
119+
public void showOfflineMessage(boolean isCritical) {
98120
Timber.d("Showing Offline Message");
99121

100122
Snackbar.make(toolbar, R.string.offline_message, Snackbar.LENGTH_LONG)
101-
.setAction(R.string.go_online, v -> {
102-
startActivity(new Intent(
103-
Settings.ACTION_WIFI_SETTINGS));
104-
})
123+
.setAction(R.string.go_online, v -> startActivity(new Intent(
124+
Settings.ACTION_WIFI_SETTINGS)))
105125
.setActionTextColor(Color.GREEN)
106126
.show();
107127
}
108128

109-
@Override
110129
public void showCharacter(CharacterModel character) {
111130
startActivity(CharacterActivity.newIntent(this, character));
112131
}
132+
133+
@Override
134+
protected void onPause() {
135+
super.onPause();
136+
137+
subscriptions.unsubscribe();
138+
}
139+
140+
@Override
141+
protected void releaseSubComponents(MarvelApplication application) {
142+
application.releaseCacheSubComponent();
143+
application.releaseSearchSubComponent();
144+
}
145+
113146
}

app/src/main/java/com/mirhoseini/marvel/activity/SplashActivity.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.view.MotionEvent;
77

88
import com.mirhoseini.marvel.ApplicationComponent;
9+
import com.mirhoseini.marvel.MarvelApplication;
910
import com.mirhoseini.marvel.R;
1011
import com.mirhoseini.marvel.base.BaseActivity;
1112
import com.mirhoseini.marvel.util.AppConstants;
@@ -61,6 +62,11 @@ public void run() {
6162
splashThread.start();
6263
}
6364

65+
@Override
66+
protected void injectDependencies(MarvelApplication application, ApplicationComponent component) {
67+
component.inject(this);
68+
}
69+
6470
// Listening to whole activity touch events
6571
@Override
6672
public boolean onTouchEvent(MotionEvent evt) {
@@ -74,7 +80,8 @@ public boolean onTouchEvent(MotionEvent evt) {
7480
}
7581

7682
@Override
77-
protected void injectDependencies(ApplicationComponent component) {
78-
component.inject(this);
83+
protected void releaseSubComponents(MarvelApplication application) {
84+
7985
}
86+
8087
}

0 commit comments

Comments
 (0)