diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index e9ebc34f0b..a5611e315b 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -82,9 +82,9 @@ android:value="ERROR" /--> + android:name="com.mapswithme.maps.SplashActivity" + android:configChanges="orientation|screenLayout|screenSize" + android:label="@string/app_name"> @@ -117,8 +117,8 @@ + android:host="ge0.me" + android:scheme="http"/> @@ -128,11 +128,11 @@ + android:host="maps.google.com" + android:scheme="https"/> + android:host="maps.google.com" + android:scheme="http"/> @@ -145,40 +145,44 @@ + android:host="*" + android:mimeType="application/vnd.google-earth.kmz"/> + android:host="*" + android:mimeType="application/vnd.google-earth.kml+xml"/> + android:host="*" + android:mimeType="*/*" + android:pathPattern=".*\\.kmz" + android:scheme="file"/> + android:host="*" + android:mimeType="*/*" + android:pathPattern=".*\\.kml" + android:scheme="file"/> - + + + + + + diff --git a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java index 8a3c915536..f23745a5c9 100644 --- a/android/src/com/mapswithme/maps/DownloadResourcesActivity.java +++ b/android/src/com/mapswithme/maps/DownloadResourcesActivity.java @@ -214,9 +214,9 @@ public class DownloadResourcesActivity extends BaseMwmFragmentActivity @CallSuper @Override - protected void safeOnCreate(@Nullable Bundle savedInstanceState) + protected void onCreate(@Nullable Bundle savedInstanceState) { - super.safeOnCreate(savedInstanceState); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_download_resources); initViewsAndListeners(); @@ -251,8 +251,9 @@ public class DownloadResourcesActivity extends BaseMwmFragmentActivity @CallSuper @Override - protected void safeOnResume() + protected void onResume() { + super.onResume(); if (!isFinishing()) LocationHelper.INSTANCE.addListener(mLocationListener, true); } @@ -488,8 +489,12 @@ public class DownloadResourcesActivity extends BaseMwmFragmentActivity if (intent == null) return false; + final Intent extra = intent.getParcelableExtra(SplashActivity.EXTRA_INTENT); + if (extra == null) + return false; + for (final IntentProcessor ip : mIntentProcessors) - if (ip.isSupported(intent) && ip.process(intent)) + if (ip.isSupported(extra) && ip.process(extra)) return true; return false; diff --git a/android/src/com/mapswithme/maps/MapFragment.java b/android/src/com/mapswithme/maps/MapFragment.java index 9595021a98..8811b5c963 100644 --- a/android/src/com/mapswithme/maps/MapFragment.java +++ b/android/src/com/mapswithme/maps/MapFragment.java @@ -166,7 +166,7 @@ public class MapFragment extends BaseMwmFragment getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); final float exactDensityDpi = metrics.densityDpi; - boolean firstStart = ((MwmActivity) getMwmActivity()).isFirstStart(); + boolean firstStart = SplashActivity.isFirstStart(); if (firstStart) PushwooshHelper.nativeProcessFirstLaunch(); diff --git a/android/src/com/mapswithme/maps/MwmActivity.java b/android/src/com/mapswithme/maps/MwmActivity.java index 729cbb38e8..80f56408a9 100644 --- a/android/src/com/mapswithme/maps/MwmActivity.java +++ b/android/src/com/mapswithme/maps/MwmActivity.java @@ -53,11 +53,8 @@ import com.mapswithme.maps.editor.EditorActivity; import com.mapswithme.maps.editor.EditorHostFragment; import com.mapswithme.maps.editor.FeatureCategoryActivity; import com.mapswithme.maps.editor.ReportFragment; -import com.mapswithme.maps.editor.ViralFragment; import com.mapswithme.maps.location.CompassData; import com.mapswithme.maps.location.LocationHelper; -import com.mapswithme.maps.news.FirstStartFragment; -import com.mapswithme.maps.news.NewsFragment; import com.mapswithme.maps.routing.NavigationController; import com.mapswithme.maps.routing.RoutingController; import com.mapswithme.maps.routing.RoutingPlanController; @@ -155,6 +152,7 @@ public class MwmActivity extends BaseMwmFragmentActivity private FadeView mFadeView; + @Nullable private MyPositionButton mNavMyPosition; private TrafficButton mTraffic; @Nullable @@ -176,8 +174,6 @@ public class MwmActivity extends BaseMwmFragmentActivity private FloatingSearchToolbarController mSearchController; - // The first launch of application ever - onboarding screen will be shown. - private boolean mFirstStart; private boolean mPlacePageRestored; private boolean mLocationErrorDialogAnnoying = false; @@ -249,7 +245,7 @@ public class MwmActivity extends BaseMwmFragmentActivity int oldLeft, int oldTop, int oldRight, int oldBottom) { mScreenFullRect = new Rect(left, top, right, bottom); - if (mPlacePageVisible && (mPlacePage == null || mPlacePage.GetPreview().getVisibility() != View.VISIBLE)) + if (mPlacePageVisible && (mPlacePage == null || UiUtils.isHidden(mPlacePage.GetPreview()))) mPlacePageVisible = false; recalculateVisibleRect(mScreenFullRect); } @@ -454,7 +450,6 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override protected void safeOnCreate(@Nullable Bundle savedInstanceState) { - super.safeOnCreate(savedInstanceState); if (savedInstanceState != null) mLocationErrorDialogAnnoying = savedInstanceState.getBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING); mIsFragmentContainer = getResources().getBoolean(R.bool.tabletLayout); @@ -885,6 +880,12 @@ public class MwmActivity extends BaseMwmFragmentActivity @Override public void onDestroy() { + if (!isInitializationComplete()) + { + super.onDestroy(); + return; + } + // TODO move listeners attach-deattach to onStart-onStop since onDestroy isn't guaranteed. Framework.nativeRemoveMapObjectListener(); BottomSheetHelper.free(); @@ -917,7 +918,8 @@ public class MwmActivity extends BaseMwmFragmentActivity RoutingController.get().onSaveState(); outState.putBoolean(EXTRA_LOCATION_DIALOG_IS_ANNOYING, mLocationErrorDialogAnnoying); - mNavMyPosition.onSaveState(outState); + if (mNavMyPosition != null) + mNavMyPosition.onSaveState(outState); if(mNavAnimationController != null) mNavAnimationController.onSaveState(outState); @@ -928,9 +930,9 @@ public class MwmActivity extends BaseMwmFragmentActivity } @Override - protected void safeOnRestoreInstanceState(@NonNull Bundle savedInstanceState) + protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { - super.safeOnRestoreInstanceState(savedInstanceState); + super.onRestoreInstanceState(savedInstanceState); final State state = State.values()[savedInstanceState.getInt(STATE_PP, 0)]; if (mPlacePage != null && state != State.HIDDEN) @@ -953,7 +955,8 @@ public class MwmActivity extends BaseMwmFragmentActivity if (mNavigationController != null) mNavigationController.onRestoreState(savedInstanceState); - mNavMyPosition.onRestoreState(savedInstanceState); + if (mNavMyPosition != null) + mNavMyPosition.onRestoreState(savedInstanceState); if(mNavAnimationController != null) mNavAnimationController.onRestoreState(savedInstanceState); @@ -1018,9 +1021,11 @@ public class MwmActivity extends BaseMwmFragmentActivity runTasks(); } + @CallSuper @Override - protected void safeOnResume() + protected void onResume() { + super.onResume(); mPlacePageRestored = mPlacePage != null && mPlacePage.getState() != State.HIDDEN; mSearchController.refreshToolbar(); mMainMenu.onResume(new Runnable() @@ -1054,23 +1059,9 @@ public class MwmActivity extends BaseMwmFragmentActivity } @Override - protected void safeOnResumeFragments() + protected void onResumeFragments() { - if (!RoutingController.get().isNavigating()) - { - mFirstStart = FirstStartFragment.showOn(this); - if (mFirstStart) - return; - - if (!NewsFragment.showOn(this)) - { - if (ViralFragment.shouldDisplay()) - new ViralFragment().show(getSupportFragmentManager(), ""); - else - LikesManager.INSTANCE.showDialogs(this); - } - } - + super.onResumeFragments(); RoutingController.get().restore(); if (mPlacePage != null) mPlacePage.restore(); @@ -1095,11 +1086,6 @@ public class MwmActivity extends BaseMwmFragmentActivity { super.onStart(); RoutingController.get().attach(this); - } - - @Override - protected void safeOnStart() - { if (MapFragment.nativeIsEngineCreated()) LocationHelper.INSTANCE.attach(this); if (mTrafficButtonController != null) @@ -1299,12 +1285,13 @@ public class MwmActivity extends BaseMwmFragmentActivity }); if (mNavAnimationController != null) mNavAnimationController.disappearZoomButtons(); - mNavMyPosition.hide(); + if (mNavMyPosition != null) + mNavMyPosition.hide(); mTraffic.hide(); } else { - if (mPlacePage.isHidden() && mNavAnimationController != null) + if (mPlacePage != null && mPlacePage.isHidden() && mNavAnimationController != null) mNavAnimationController.appearZoomButtons(); if (!mIsFullscreenAnimating) appearMenu(menu); @@ -1323,7 +1310,8 @@ public class MwmActivity extends BaseMwmFragmentActivity adjustRuler(0, 0); } }); - mNavMyPosition.show(); + if (mNavMyPosition != null) + mNavMyPosition.show(); mTraffic.show(); } @@ -1811,17 +1799,11 @@ public class MwmActivity extends BaseMwmFragmentActivity mSearchController.refreshToolbar(); } - boolean isFirstStart() - { - boolean res = mFirstStart; - mFirstStart = false; - return res; - } - @Override public void onMyPositionModeChanged(int newMode) { - mNavMyPosition.update(newMode); + if (mNavMyPosition != null) + mNavMyPosition.update(newMode); } @Override diff --git a/android/src/com/mapswithme/maps/MwmApplication.java b/android/src/com/mapswithme/maps/MwmApplication.java index af8293af93..5d64e6f3f3 100644 --- a/android/src/com/mapswithme/maps/MwmApplication.java +++ b/android/src/com/mapswithme/maps/MwmApplication.java @@ -10,7 +10,6 @@ import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.UiThread; import android.support.multidex.MultiDex; -import android.support.v7.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; @@ -33,6 +32,7 @@ import com.mapswithme.maps.sound.TtsPlayer; import com.mapswithme.maps.traffic.TrafficManager; import com.mapswithme.util.Config; import com.mapswithme.util.Constants; +import com.mapswithme.util.Counters; import com.mapswithme.util.ThemeSwitcher; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; @@ -56,9 +56,7 @@ public class MwmApplication extends Application private SharedPreferences mPrefs; private AppBackgroundTracker mBackgroundTracker; - private boolean mAreCountersInitialized; private boolean mIsFrameworkInitialized; - private boolean mIsPlatformInitialized; private Handler mMainLoopHandler; private final Object mMainQueueToken = new Object(); @@ -157,9 +155,6 @@ public class MwmApplication extends Application public void initNativePlatform() { - if (mIsPlatformInitialized) - return; - final boolean isInstallationIdFound = setInstallationIdToCrashlytics(); initTracker(); @@ -185,8 +180,6 @@ public class MwmApplication extends Application mBackgroundTracker.addListener(mBackgroundListener); TrackRecorder.init(); Editor.init(); - - mIsPlatformInitialized = true; } public void initNativeCore() @@ -264,11 +257,6 @@ public class MwmApplication extends Application return mIsFrameworkInitialized; } - public boolean isPlatformInitialized() - { - return mIsPlatformInitialized; - } - public String getApkPath() { try @@ -370,19 +358,9 @@ public class MwmApplication extends Application MyTracker.initTracker(); } - public void initCounters() - { - if (!mAreCountersInitialized) - { - mAreCountersInitialized = true; - Config.updateLaunchCounter(); - PreferenceManager.setDefaultValues(this, R.xml.prefs_main, false); - } - } - public static void onUpgrade() { - Config.resetAppSessionCounters(); + Counters.resetAppSessionCounters(); } @SuppressWarnings("unused") diff --git a/android/src/com/mapswithme/maps/SplashActivity.java b/android/src/com/mapswithme/maps/SplashActivity.java new file mode 100644 index 0000000000..2dc9545dc1 --- /dev/null +++ b/android/src/com/mapswithme/maps/SplashActivity.java @@ -0,0 +1,198 @@ +package com.mapswithme.maps; + +import android.app.Activity; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; +import android.support.v7.app.AppCompatActivity; + +import com.mapswithme.maps.ads.LikesManager; +import com.mapswithme.maps.editor.ViralFragment; +import com.mapswithme.maps.location.LocationHelper; +import com.mapswithme.maps.news.BaseNewsFragment; +import com.mapswithme.maps.news.FirstStartFragment; +import com.mapswithme.maps.news.NewsFragment; +import com.mapswithme.util.Counters; +import com.mapswithme.util.UiUtils; +import com.mapswithme.util.Utils; +import com.mapswithme.util.concurrency.UiThread; + +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.Manifest.permission.GET_ACCOUNTS; +import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + +public class SplashActivity extends AppCompatActivity + implements BaseNewsFragment.NewsDialogListener +{ + public static final String[] PERMISSIONS = new String[] + { + WRITE_EXTERNAL_STORAGE, + ACCESS_COARSE_LOCATION, + ACCESS_FINE_LOCATION, + GET_ACCOUNTS + }; + public static final String EXTRA_INTENT = "extra_intent"; + private static final String EXTRA_ACTIVITY_TO_START = "extra_activity_to_start"; + private static final int REQUEST_PERMISSIONS = 1; + private static final long DELAY = 100; + + // The first launch of application ever - onboarding screen will be shown. + private static boolean sFirstStart; + + private boolean mPermissionsGranted; + + public static void start(@NonNull Context context, + @Nullable Class activityToStart) + { + Intent intent = new Intent(context, SplashActivity.class); + intent.putExtra(EXTRA_ACTIVITY_TO_START, activityToStart); + context.startActivity(intent); + } + + public static boolean isFirstStart() + { + boolean res = sFirstStart; + sFirstStart = false; + return res; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + Counters.initCounters(this); + initView(); + } + + @Override + protected void onResume() + { + super.onResume(); + mPermissionsGranted = Utils.checkPermissions(this, PERMISSIONS); + if (!mPermissionsGranted) + { +// TODO requestPermissions after Permissions dialog + ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_PERMISSIONS); + return; + } + + UiThread.runLater(new Runnable() + { + @Override + public void run() + { + init(); + resumeDialogs(); + } + }, DELAY); + } + + private void resumeDialogs() + { + // TODO show permissions dialog if Permissions is not granted + if (!mPermissionsGranted) + return; + + sFirstStart = FirstStartFragment.showOn(this, this); + if (sFirstStart) + return; + + if (!NewsFragment.showOn(this, this)) + { + if (ViralFragment.shouldDisplay()) + { + ViralFragment dialog = new ViralFragment(); + dialog.onDismiss(new DialogInterface() + { + @Override + public void cancel() + { + processNavigation(); + } + + @Override + public void dismiss() + { + processNavigation(); + } + }); + dialog.show(getSupportFragmentManager(), ""); + } + else + { + LikesManager.INSTANCE.showDialogs(this); + processNavigation(); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) + { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (grantResults.length == 0) + return; + + boolean isWriteGranted = false; + for (int i = 0; i < permissions.length; ++i) + { + int result = grantResults[i]; + String permission = permissions[i]; + if (permission.equals(WRITE_EXTERNAL_STORAGE) && result == PERMISSION_GRANTED) + isWriteGranted = true; + } + + if (isWriteGranted) + { + mPermissionsGranted = true; + init(); + resumeDialogs(); + } + else + { + finish(); + } + } + + @Override + public void onDialogDone() + { + processNavigation(); + } + + private void initView() + { + UiUtils.setupStatusBar(this); + setContentView(R.layout.activity_splash); + } + + private void init() + { + MwmApplication.get().initNativePlatform(); + MwmApplication.get().initNativeCore(); + LocationHelper.INSTANCE.init(); + } + + @SuppressWarnings("unchecked") + private void processNavigation() + { + Intent input = getIntent(); + Intent intent = new Intent(this, DownloadResourcesActivity.class); + if (input != null) + { + Class type = (Class) input.getSerializableExtra(EXTRA_ACTIVITY_TO_START); + if (type != null) + intent = new Intent(this, type); + intent.putExtra(EXTRA_INTENT, input); + } + startActivity(intent); + finish(); + } +} diff --git a/android/src/com/mapswithme/maps/ads/GooglePlusDialogFragment.java b/android/src/com/mapswithme/maps/ads/GooglePlusDialogFragment.java index f4b2207412..0cb87fce36 100644 --- a/android/src/com/mapswithme/maps/ads/GooglePlusDialogFragment.java +++ b/android/src/com/mapswithme/maps/ads/GooglePlusDialogFragment.java @@ -11,8 +11,8 @@ import android.view.LayoutInflater; import com.google.android.gms.plus.PlusOneButton; import com.mapswithme.maps.R; import com.mapswithme.maps.base.BaseMwmDialogFragment; -import com.mapswithme.util.Config; import com.mapswithme.util.Constants; +import com.mapswithme.util.Counters; import com.mapswithme.util.statistics.Statistics; public class GooglePlusDialogFragment extends BaseMwmDialogFragment @@ -31,7 +31,7 @@ public class GooglePlusDialogFragment extends BaseMwmDialogFragment @Override public void onPlusOneClick(Intent intent) { - Config.setRatingApplied(GooglePlusDialogFragment.class); + Counters.setRatingApplied(GooglePlusDialogFragment.class); dismiss(); startActivityForResult(intent, 0); } diff --git a/android/src/com/mapswithme/maps/ads/LikesManager.java b/android/src/com/mapswithme/maps/ads/LikesManager.java index ae4e068456..07f9a2d521 100644 --- a/android/src/com/mapswithme/maps/ads/LikesManager.java +++ b/android/src/com/mapswithme/maps/ads/LikesManager.java @@ -8,8 +8,8 @@ import java.lang.ref.WeakReference; import com.mapswithme.maps.BuildConfig; import com.mapswithme.maps.routing.RoutingController; -import com.mapswithme.util.Config; import com.mapswithme.util.ConnectionState; +import com.mapswithme.util.Counters; import com.mapswithme.util.concurrency.UiThread; public enum LikesManager @@ -19,7 +19,7 @@ public enum LikesManager private static final int DIALOG_DELAY_DEFAULT = 30000; private static final int DIALOG_DELAY_SHORT = 5000; - private static final int SESSION_NUM = Config.getSessionCount(); + private static final int SESSION_NUM = Counters.getSessionCount(); /* Maps type of like dialog to the dialog, performing like. @@ -72,7 +72,7 @@ public enum LikesManager sNewUsersMapping.put(55, LikeType.FACEBOOK_INVITE_NEW_USERS); } - private final boolean mIsNewUser = (Config.getFirstInstallVersion() == BuildConfig.VERSION_CODE); + private final boolean mIsNewUser = (Counters.getFirstInstallVersion() == BuildConfig.VERSION_CODE); private Runnable mLikeRunnable; private WeakReference mActivityRef; @@ -95,10 +95,10 @@ public enum LikesManager private void displayLikeDialog(final Class dialogFragmentClass, final int delayMillis) { - if (Config.isSessionRated(SESSION_NUM) || Config.isRatingApplied(dialogFragmentClass)) + if (Counters.isSessionRated(SESSION_NUM) || Counters.isRatingApplied(dialogFragmentClass)) return; - Config.setRatedSession(SESSION_NUM); + Counters.setRatedSession(SESSION_NUM); UiThread.cancelDelayedTasks(mLikeRunnable); mLikeRunnable = new Runnable() diff --git a/android/src/com/mapswithme/maps/ads/RateStoreDialogFragment.java b/android/src/com/mapswithme/maps/ads/RateStoreDialogFragment.java index 5a710216e7..d08d98b220 100644 --- a/android/src/com/mapswithme/maps/ads/RateStoreDialogFragment.java +++ b/android/src/com/mapswithme/maps/ads/RateStoreDialogFragment.java @@ -22,8 +22,8 @@ import com.mapswithme.maps.BuildConfig; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; import com.mapswithme.maps.base.BaseMwmDialogFragment; -import com.mapswithme.util.Config; import com.mapswithme.util.Constants; +import com.mapswithme.util.Counters; import com.mapswithme.util.Graphics; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; @@ -64,7 +64,7 @@ public class RateStoreDialogFragment extends BaseMwmDialogFragment implements Vi mRating = rating; if (rating >= BuildConfig.RATING_THRESHOLD) { - Config.setRatingApplied(RateStoreDialogFragment.class); + Counters.setRatingApplied(RateStoreDialogFragment.class); dismiss(); Utils.openAppInMarket(getActivity(), BuildConfig.REVIEW_URL); } @@ -109,7 +109,7 @@ public class RateStoreDialogFragment extends BaseMwmDialogFragment implements Vi switch (v.getId()) { case R.id.btn__explain_bad_rating: - Config.setRatingApplied(GooglePlusDialogFragment.class); + Counters.setRatingApplied(GooglePlusDialogFragment.class); dismiss(); final Intent intent = new Intent(Intent.ACTION_SENDTO); final PackageInfo info; diff --git a/android/src/com/mapswithme/maps/background/ConnectivityChangedReceiver.java b/android/src/com/mapswithme/maps/background/ConnectivityChangedReceiver.java index 740eef4908..13017f93c7 100644 --- a/android/src/com/mapswithme/maps/background/ConnectivityChangedReceiver.java +++ b/android/src/com/mapswithme/maps/background/ConnectivityChangedReceiver.java @@ -18,7 +18,8 @@ public class ConnectivityChangedReceiver extends BroadcastReceiver @Override public void onReceive(Context context, Intent intent) { - if (!ConnectionState.isWifiConnected() || MapManager.nativeNeedMigrate()) + if (!MwmApplication.get().isFrameworkInitialized() || !ConnectionState.isWifiConnected() + || MapManager.nativeNeedMigrate()) return; final long lastEventTimestamp = prefs().getLong(DOWNLOAD_UPDATE_TIMESTAMP, 0); diff --git a/android/src/com/mapswithme/maps/base/BaseActivityDelegate.java b/android/src/com/mapswithme/maps/base/BaseActivityDelegate.java index 2d69367e0d..3431c4e3f8 100644 --- a/android/src/com/mapswithme/maps/base/BaseActivityDelegate.java +++ b/android/src/com/mapswithme/maps/base/BaseActivityDelegate.java @@ -1,23 +1,15 @@ package com.mapswithme.maps.base; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.mapswithme.maps.MwmApplication; -import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.util.Config; import com.mapswithme.util.UiUtils; -import com.mapswithme.util.Utils; import com.mapswithme.util.ViewServer; import com.mapswithme.util.concurrency.UiThread; import com.mapswithme.util.statistics.Statistics; import com.my.tracker.MyTracker; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; - public class BaseActivityDelegate { @NonNull @@ -33,7 +25,8 @@ public class BaseActivityDelegate public void onCreate() { mThemeName = Config.getCurrentUiTheme(); - mActivity.get().setTheme(mActivity.getThemeResourceId(mThemeName)); + if (mThemeName != null) + mActivity.get().setTheme(mActivity.getThemeResourceId(mThemeName)); } public void onDestroy() @@ -48,24 +41,18 @@ public class BaseActivityDelegate public void onStart() { - if (!MwmApplication.get().isPlatformInitialized() || !Utils.isWriteExternalGranted(mActivity.get())) - return; Statistics.INSTANCE.startActivity(mActivity.get()); MyTracker.onStartActivity(mActivity.get()); } public void onStop() { - if (!MwmApplication.get().isPlatformInitialized() || !Utils.isWriteExternalGranted(mActivity.get())) - return; Statistics.INSTANCE.stopActivity(mActivity.get()); MyTracker.onStopActivity(mActivity.get()); } public void onResume() { - if (!MwmApplication.get().isPlatformInitialized() || !Utils.isWriteExternalGranted(mActivity.get())) - return; org.alohalytics.Statistics.logEvent("$onResume", mActivity.getClass().getSimpleName() + ":" + UiUtils.deviceOrientationAsString(mActivity.get())); ViewServer.get(mActivity.get()).setFocusedWindow(mActivity.get()); @@ -73,14 +60,12 @@ public class BaseActivityDelegate public void onPause() { - if (!MwmApplication.get().isPlatformInitialized() || !Utils.isWriteExternalGranted(mActivity.get())) - return; org.alohalytics.Statistics.logEvent("$onPause", mActivity.getClass().getSimpleName()); } public void onPostResume() { - if (mThemeName == null || mThemeName.equals(Config.getCurrentUiTheme()) || !Utils.isWriteExternalGranted(mActivity.get())) + if (mThemeName != null && mThemeName.equals(Config.getCurrentUiTheme())) return; // Workaround described in https://code.google.com/p/android/issues/detail?id=93731 diff --git a/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java b/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java index be559b7756..d8833f9694 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmDialogFragment.java @@ -1,28 +1,15 @@ package com.mapswithme.maps.base; import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.support.v4.app.DialogFragment; -import android.view.View; -import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; import com.mapswithme.util.ThemeUtils; -import com.mapswithme.util.Utils; - -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; public class BaseMwmDialogFragment extends DialogFragment { - @Nullable - private View mView; - @Nullable - private Bundle mSavedInstanceState; - protected final @StyleRes int getFullscreenTheme() { return (ThemeUtils.isNightTheme() ? R.style.MwmTheme_DialogFragment_Fullscreen_Night @@ -43,20 +30,12 @@ public class BaseMwmDialogFragment extends DialogFragment public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mSavedInstanceState = savedInstanceState; int style = getStyle(); int theme = getCustomTheme(); if (style != STYLE_NORMAL || theme != 0) //noinspection WrongConstant setStyle(style, theme); - - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnCreate(savedInstanceState); - } - - protected void safeOnCreate(@Nullable Bundle savedInstanceState) - { } @Override @@ -65,13 +44,6 @@ public class BaseMwmDialogFragment extends DialogFragment super.onResume(); org.alohalytics.Statistics.logEvent("$onResume", getClass().getSimpleName() + ":" + com.mapswithme.util.UiUtils.deviceOrientationAsString(getActivity())); - - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnResume(); - } - - protected void safeOnResume() - { } @Override @@ -80,58 +52,4 @@ public class BaseMwmDialogFragment extends DialogFragment super.onPause(); org.alohalytics.Statistics.logEvent("$onPause", getClass().getSimpleName()); } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) - { - super.onViewCreated(view, savedInstanceState); - mView = view; - mSavedInstanceState = savedInstanceState; - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnViewCreated(view, savedInstanceState); - } - - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) - { - } - - @CallSuper - @Override - public void onDestroyView() - { - mView = null; - mSavedInstanceState = null; - super.onDestroyView(); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) - { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults.length == 0) - return; - - boolean isWriteGranted = false; - for (int i = 0; i < permissions.length; ++i) - { - int result = grantResults[i]; - String permission = permissions[i]; - if (permission.equals(WRITE_EXTERNAL_STORAGE) && result == PERMISSION_GRANTED) - isWriteGranted = true; - } - - if (isWriteGranted) - safeOnCreate(mSavedInstanceState); - - if (isWriteGranted && mView != null) - { - safeOnViewCreated(mView, mSavedInstanceState); - safeOnResume(); - } - } - - public BaseMwmFragmentActivity getMwmActivity() - { - return (BaseMwmFragmentActivity) getActivity(); - } } diff --git a/android/src/com/mapswithme/maps/base/BaseMwmFragment.java b/android/src/com/mapswithme/maps/base/BaseMwmFragment.java index 5a01b91df7..c86c4bc85f 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmFragment.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmFragment.java @@ -1,24 +1,26 @@ package com.mapswithme.maps.base; -import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import android.content.Context; import android.support.v4.app.Fragment; -import android.view.View; +import android.support.v7.app.AppCompatActivity; import com.mapswithme.maps.MwmApplication; -import com.mapswithme.util.Utils; - -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; public class BaseMwmFragment extends Fragment { - @Nullable - private View mView; - @Nullable - private Bundle mSavedInstanceState; + + @Override + public void onAttach(Context context) + { + super.onAttach(context); + if (context instanceof AppCompatActivity && !MwmApplication.get().isFrameworkInitialized()) + { + ((AppCompatActivity)context).getSupportFragmentManager() + .beginTransaction() + .detach(this) + .commit(); + } + } @Override public void onResume() @@ -26,13 +28,6 @@ public class BaseMwmFragment extends Fragment super.onResume(); org.alohalytics.Statistics.logEvent("$onResume", this.getClass().getSimpleName() + ":" + com.mapswithme.util.UiUtils.deviceOrientationAsString(getActivity())); - - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnResume(); - } - - protected void safeOnResume() - { } @Override @@ -42,53 +37,6 @@ public class BaseMwmFragment extends Fragment org.alohalytics.Statistics.logEvent("$onPause", this.getClass().getSimpleName()); } - @CallSuper - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) - { - super.onViewCreated(view, savedInstanceState); - mView = view; - mSavedInstanceState = savedInstanceState; - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnViewCreated(view, savedInstanceState); - } - - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) - { - } - - @CallSuper - @Override - public void onDestroyView() - { - mView = null; - mSavedInstanceState = null; - super.onDestroyView(); - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) - { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults.length == 0) - return; - - boolean isWriteGranted = false; - for (int i = 0; i < permissions.length; ++i) - { - int result = grantResults[i]; - String permission = permissions[i]; - if (permission.equals(WRITE_EXTERNAL_STORAGE) && result == PERMISSION_GRANTED) - isWriteGranted = true; - } - - if (isWriteGranted && mView != null) - { - safeOnViewCreated(mView, mSavedInstanceState); - safeOnResume(); - } - } - public BaseMwmFragmentActivity getMwmActivity() { return (BaseMwmFragmentActivity) getActivity(); diff --git a/android/src/com/mapswithme/maps/base/BaseMwmFragmentActivity.java b/android/src/com/mapswithme/maps/base/BaseMwmFragmentActivity.java index e73b965541..506cdffbf4 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmFragmentActivity.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmFragmentActivity.java @@ -3,8 +3,8 @@ package com.mapswithme.maps.base; import android.app.Activity; import android.media.AudioManager; import android.os.Bundle; -import android.support.annotation.ColorRes; import android.support.annotation.CallSuper; +import android.support.annotation.ColorRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; @@ -13,41 +13,23 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import com.mapswithme.maps.MwmActivity; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; +import com.mapswithme.maps.SplashActivity; import com.mapswithme.util.Config; -import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.util.ThemeUtils; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; -import static android.Manifest.permission.ACCESS_COARSE_LOCATION; -import static android.Manifest.permission.ACCESS_FINE_LOCATION; -import static android.Manifest.permission.GET_ACCOUNTS; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; - public class BaseMwmFragmentActivity extends AppCompatActivity implements BaseActivity { - private static final int REQUEST_PERMISSIONS_START = 1; - private static final int REQUEST_PERMISSIONS_RESUME = 2; - - private static final String[] START_PERMISSIONS = new String[] - { - WRITE_EXTERNAL_STORAGE, - ACCESS_COARSE_LOCATION, - ACCESS_FINE_LOCATION, - GET_ACCOUNTS - }; - private static final String[] RESUME_PERMISSIONS = new String[] {WRITE_EXTERNAL_STORAGE}; - private final BaseActivityDelegate mBaseDelegate = new BaseActivityDelegate(this); @Nullable - private Bundle mSavedInstanceState; - private boolean mRequestedFromOnCreate = false; - private boolean mFromInstanceState = false; + private Bundle mSavedState; + private boolean mInitializationComplete = false; @Override public Activity get() @@ -68,29 +50,23 @@ public class BaseMwmFragmentActivity extends AppCompatActivity throw new IllegalArgumentException("Attempt to apply unsupported theme: " + theme); } + @CallSuper @Override protected void onCreate(@Nullable Bundle savedInstanceState) { - mFromInstanceState = savedInstanceState != null; - if (!Utils.checkPermissions(this, MwmApplication.get().isPlatformInitialized() - ? RESUME_PERMISSIONS : START_PERMISSIONS, - REQUEST_PERMISSIONS_START)) + mSavedState = savedInstanceState; + if (!MwmApplication.get().isFrameworkInitialized() + || !Utils.checkPermissions(this, SplashActivity.PERMISSIONS)) { - mRequestedFromOnCreate = true; super.onCreate(savedInstanceState); + goToSplashScreen(); return; } + mInitializationComplete = true; - MwmApplication.get().initNativePlatform(); mBaseDelegate.onCreate(); - super.onCreate(savedInstanceState); - safeOnCreate(savedInstanceState); - } - @CallSuper - protected void safeOnCreate(@Nullable Bundle savedInstanceState) - { setVolumeControlStream(AudioManager.STREAM_MUSIC); final int layoutId = getContentLayoutResId(); if (layoutId != 0) @@ -108,12 +84,18 @@ public class BaseMwmFragmentActivity extends AppCompatActivity getWindow().clearFlags(android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } - MwmApplication.get().initNativeCore(); - MwmApplication.get().initCounters(); - - LocationHelper.INSTANCE.init(); - attachDefaultFragment(); + + safeOnCreate(savedInstanceState); + } + + protected void safeOnCreate(@Nullable Bundle savedInstanceState) + { + } + + protected boolean isInitializationComplete() + { + return mInitializationComplete; } @ColorRes @@ -158,12 +140,6 @@ public class BaseMwmFragmentActivity extends AppCompatActivity { super.onStart(); mBaseDelegate.onStart(); - if (MwmApplication.get().isPlatformInitialized()) - safeOnStart(); - } - - protected void safeOnStart() - { } @Override @@ -173,25 +149,6 @@ public class BaseMwmFragmentActivity extends AppCompatActivity mBaseDelegate.onStop(); } - @Override - protected void onRestoreInstanceState(Bundle savedInstanceState) - { - super.onRestoreInstanceState(savedInstanceState); - mSavedInstanceState = savedInstanceState; - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(this)) - safeOnRestoreInstanceState(savedInstanceState); - } - - protected void safeOnRestoreInstanceState(@NonNull Bundle savedInstanceState) - { - } - - @Nullable - public Bundle getSavedInstanceState() - { - return mSavedInstanceState; - } - @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -203,23 +160,18 @@ public class BaseMwmFragmentActivity extends AppCompatActivity return super.onOptionsItemSelected(item); } + @CallSuper @Override protected void onResume() { super.onResume(); - if (!mRequestedFromOnCreate && !Utils.checkPermissions(this, RESUME_PERMISSIONS, - REQUEST_PERMISSIONS_RESUME)) + if (!Utils.checkPermissions(this, SplashActivity.PERMISSIONS)) { + goToSplashScreen(); return; } mBaseDelegate.onResume(); - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(this)) - safeOnResume(); - } - - protected void safeOnResume() - { } @Override @@ -229,19 +181,6 @@ public class BaseMwmFragmentActivity extends AppCompatActivity mBaseDelegate.onPostResume(); } - @CallSuper - @Override - protected void onResumeFragments() - { - super.onResumeFragments(); - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(this)) - safeOnResumeFragments(); - } - - protected void safeOnResumeFragments() - { - } - @Override protected void onPause() { @@ -249,48 +188,6 @@ public class BaseMwmFragmentActivity extends AppCompatActivity mBaseDelegate.onPause(); } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) - { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults.length == 0) - return; - - boolean isWriteGranted = false; - for (int i = 0; i < permissions.length; ++i) - { - int result = grantResults[i]; - String permission = permissions[i]; - if (permission.equals(WRITE_EXTERNAL_STORAGE) && result == PERMISSION_GRANTED) - isWriteGranted = true; - } - if (isWriteGranted) - { - if (requestCode == REQUEST_PERMISSIONS_START) - { - MwmApplication.get().initNativePlatform(); - mBaseDelegate.onCreate(); - safeOnCreate(mSavedInstanceState); - mBaseDelegate.onStart(); - if (mSavedInstanceState != null) - safeOnRestoreInstanceState(mSavedInstanceState); - mBaseDelegate.onResume(); - safeOnResume(); - if (!mFromInstanceState) - safeOnResumeFragments(); - } - else if (requestCode == REQUEST_PERMISSIONS_RESUME) - { - safeOnResume(); - safeOnResumeFragments(); - } - } - else - { - finish(); - } - } - protected Toolbar getToolbar() { return (Toolbar) findViewById(R.id.toolbar); @@ -355,4 +252,19 @@ public class BaseMwmFragmentActivity extends AppCompatActivity { return android.R.id.content; } + + private void goToSplashScreen() + { + Class type = null; + if (!(this instanceof MwmActivity)) + type = getClass(); + SplashActivity.start(this, type); + finish(); + } + + @Nullable + public Bundle getSavedInstanceState() + { + return mSavedState; + } } diff --git a/android/src/com/mapswithme/maps/base/BaseMwmListFragment.java b/android/src/com/mapswithme/maps/base/BaseMwmListFragment.java index 172571a922..86ed6705bf 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmListFragment.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmListFragment.java @@ -1,10 +1,10 @@ package com.mapswithme.maps.base; +import android.content.Context; import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.ListFragment; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; @@ -13,28 +13,22 @@ import com.mapswithme.maps.R; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; - @Deprecated public abstract class BaseMwmListFragment extends ListFragment { private Toolbar mToolbar; - @Nullable - private View mView; - @Nullable - private Bundle mSavedInstanceState; @Override - public void onCreate(@Nullable Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnCreate(savedInstanceState); - } - - protected void safeOnCreate(@Nullable Bundle savedInstanceState) + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof AppCompatActivity && !MwmApplication.get().isFrameworkInitialized()) + { + ((AppCompatActivity)context).getSupportFragmentManager() + .beginTransaction() + .detach(this) + .commit(); + } } @Override @@ -42,15 +36,6 @@ public abstract class BaseMwmListFragment extends ListFragment { super.onViewCreated(view, savedInstanceState); - mView = view; - mSavedInstanceState = savedInstanceState; - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnViewCreated(view, savedInstanceState); - } - - @CallSuper - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) - { mToolbar = (Toolbar) view.findViewById(R.id.toolbar); if (mToolbar != null) { @@ -66,33 +51,6 @@ public abstract class BaseMwmListFragment extends ListFragment } } - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) - { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults.length == 0) - return; - - boolean isWriteGranted = false; - for (int i = 0; i < permissions.length; ++i) - { - int result = grantResults[i]; - String permission = permissions[i]; - if (permission.equals(WRITE_EXTERNAL_STORAGE) && result == PERMISSION_GRANTED) - isWriteGranted = true; - } - - if (isWriteGranted) - { - safeOnCreate(mSavedInstanceState); - if (mView != null) - { - safeOnViewCreated(mView, mSavedInstanceState); - safeOnResume(); - } - } - } - public Toolbar getToolbar() { return mToolbar; @@ -104,13 +62,6 @@ public abstract class BaseMwmListFragment extends ListFragment super.onResume(); org.alohalytics.Statistics.logEvent("$onResume", getClass().getSimpleName() + ":" + UiUtils.deviceOrientationAsString(getActivity())); - - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnResume(); - } - - protected void safeOnResume() - { } @Override diff --git a/android/src/com/mapswithme/maps/base/BaseMwmRecyclerFragment.java b/android/src/com/mapswithme/maps/base/BaseMwmRecyclerFragment.java index 0438a2bb0a..5615944bed 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmRecyclerFragment.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmRecyclerFragment.java @@ -1,11 +1,13 @@ package com.mapswithme.maps.base; +import android.content.Context; import android.os.Bundle; import android.support.annotation.CallSuper; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; @@ -19,9 +21,6 @@ import com.mapswithme.maps.widget.PlaceholderView; import com.mapswithme.util.UiUtils; import com.mapswithme.util.Utils; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; - public abstract class BaseMwmRecyclerFragment extends Fragment { private Toolbar mToolbar; @@ -29,11 +28,6 @@ public abstract class BaseMwmRecyclerFragment extends Fragment private RecyclerView mRecycler; private PlaceholderView mPlaceholder; - @Nullable - private View mView; - @Nullable - private Bundle mSavedInstanceState; - protected abstract RecyclerView.Adapter createAdapter(); protected @LayoutRes int getLayoutRes() @@ -47,26 +41,31 @@ public abstract class BaseMwmRecyclerFragment extends Fragment return mRecycler != null ? mRecycler.getAdapter() : null; } + @Override + public void onAttach(Context context) + { + super.onAttach(context); + if (context instanceof AppCompatActivity && !MwmApplication.get().isFrameworkInitialized()) + { + ((AppCompatActivity)context).getSupportFragmentManager() + .beginTransaction() + .detach(this) + .commit(); + } + } + @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(getLayoutRes(), container, false); } + @CallSuper @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - mView = view; - mSavedInstanceState = savedInstanceState; - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnViewCreated(view, savedInstanceState); - } - - @CallSuper - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) - { mToolbar = (Toolbar) view.findViewById(R.id.toolbar); if (mToolbar != null) { @@ -94,50 +93,6 @@ public abstract class BaseMwmRecyclerFragment extends Fragment setupPlaceholder(mPlaceholder); } - @CallSuper - @Override - public void onDestroyView() - { - mView = null; - mSavedInstanceState = null; - super.onDestroyView(); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) - { - super.onActivityCreated(savedInstanceState); - if (MwmApplication.get().isPlatformInitialized() && Utils.isWriteExternalGranted(getActivity())) - safeOnActivityCreated(savedInstanceState); - } - - protected void safeOnActivityCreated(@Nullable Bundle savedInstanceState) - { - } - - @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) - { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (grantResults.length == 0) - return; - - boolean isWriteGranted = false; - for (int i = 0; i < permissions.length; ++i) - { - int result = grantResults[i]; - String permission = permissions[i]; - if (permission.equals(WRITE_EXTERNAL_STORAGE) && result == PERMISSION_GRANTED) - isWriteGranted = true; - } - - if (isWriteGranted && mView != null) - { - safeOnViewCreated(mView, mSavedInstanceState); - safeOnActivityCreated(mSavedInstanceState); - } - } - public Toolbar getToolbar() { return mToolbar; diff --git a/android/src/com/mapswithme/maps/base/BaseMwmToolbarFragment.java b/android/src/com/mapswithme/maps/base/BaseMwmToolbarFragment.java index a2548098c8..72f27853b1 100644 --- a/android/src/com/mapswithme/maps/base/BaseMwmToolbarFragment.java +++ b/android/src/com/mapswithme/maps/base/BaseMwmToolbarFragment.java @@ -1,7 +1,6 @@ package com.mapswithme.maps.base; import android.os.Bundle; -import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.View; @@ -12,9 +11,8 @@ public class BaseMwmToolbarFragment extends BaseMwmFragment { protected ToolbarController mToolbarController; - @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { mToolbarController = onCreateToolbarController(view); } diff --git a/android/src/com/mapswithme/maps/base/BaseToolbarActivity.java b/android/src/com/mapswithme/maps/base/BaseToolbarActivity.java index c295c161ea..58157b8e8c 100644 --- a/android/src/com/mapswithme/maps/base/BaseToolbarActivity.java +++ b/android/src/com/mapswithme/maps/base/BaseToolbarActivity.java @@ -14,20 +14,23 @@ public abstract class BaseToolbarActivity extends BaseMwmFragmentActivity { @CallSuper @Override - protected void safeOnCreate(@Nullable Bundle savedInstanceState) + protected void onCreate(@Nullable Bundle savedInstanceState) { - super.safeOnCreate(savedInstanceState); + super.onCreate(savedInstanceState); Toolbar toolbar = getToolbar(); - UiUtils.extendViewWithStatusBar(toolbar); - int title = getToolbarTitle(); - if (title == 0) - toolbar.setTitle(getTitle()); - else - toolbar.setTitle(title); + if (toolbar != null) + { + UiUtils.extendViewWithStatusBar(toolbar); + int title = getToolbarTitle(); + if (title == 0) + toolbar.setTitle(getTitle()); + else + toolbar.setTitle(title); - UiUtils.showHomeUpButton(toolbar); - displayToolbarAsActionBar(); + UiUtils.showHomeUpButton(toolbar); + displayToolbarAsActionBar(); + } } @StringRes diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java index b5931fa4cb..7aec8a9803 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarkCategoriesFragment.java @@ -51,9 +51,9 @@ public class BookmarkCategoriesFragment extends BaseMwmRecyclerFragment @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); if (getAdapter() != null) { diff --git a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java index b117183aa4..fd1cdd5f8f 100644 --- a/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java +++ b/android/src/com/mapswithme/maps/bookmarks/BookmarksListFragment.java @@ -43,8 +43,9 @@ public class BookmarksListFragment extends BaseMwmListFragment @CallSuper @Override - protected void safeOnCreate(@Nullable Bundle savedInstanceState) + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); mCategoryIndex = getArguments().getInt(ChooseBookmarkCategoryFragment.CATEGORY_ID, -1); mCategory = BookmarkManager.INSTANCE.getCategory(mCategoryIndex); } @@ -57,9 +58,9 @@ public class BookmarksListFragment extends BaseMwmListFragment @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); initList(); setHasOptionsMenu(true); ActionBar bar = ((AppCompatActivity) getActivity()).getSupportActionBar(); @@ -68,8 +69,9 @@ public class BookmarksListFragment extends BaseMwmListFragment } @Override - protected void safeOnResume() + public void onResume() { + super.onResume(); if (mAdapter == null) return; diff --git a/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java b/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java index 12ff82a0d8..90a1f71792 100644 --- a/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java +++ b/android/src/com/mapswithme/maps/downloader/DownloaderFragment.java @@ -116,9 +116,9 @@ public class DownloaderFragment extends BaseMwmRecyclerFragment getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); } - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); mSubscriberSlot = MapManager.nativeSubscribe(new MapManager.StorageCallback() { @Override diff --git a/android/src/com/mapswithme/maps/editor/EditorFragment.java b/android/src/com/mapswithme/maps/editor/EditorFragment.java index f1d6aacd73..3e9d737b0c 100644 --- a/android/src/com/mapswithme/maps/editor/EditorFragment.java +++ b/android/src/com/mapswithme/maps/editor/EditorFragment.java @@ -126,7 +126,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { mIsViewCreated = true; diff --git a/android/src/com/mapswithme/maps/editor/EditorHostFragment.java b/android/src/com/mapswithme/maps/editor/EditorHostFragment.java index 11fae484d3..43c97abca0 100644 --- a/android/src/com/mapswithme/maps/editor/EditorHostFragment.java +++ b/android/src/com/mapswithme/maps/editor/EditorHostFragment.java @@ -121,9 +121,9 @@ public class EditorHostFragment extends BaseMwmToolbarFragment @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); mToolbarController.findViewById(R.id.save).setOnClickListener(this); mToolbarController.getToolbar().setNavigationOnClickListener(new View.OnClickListener() diff --git a/android/src/com/mapswithme/maps/editor/FeatureCategoryFragment.java b/android/src/com/mapswithme/maps/editor/FeatureCategoryFragment.java index 7153d2e801..e1ee89b7ab 100644 --- a/android/src/com/mapswithme/maps/editor/FeatureCategoryFragment.java +++ b/android/src/com/mapswithme/maps/editor/FeatureCategoryFragment.java @@ -34,9 +34,9 @@ public class FeatureCategoryFragment extends BaseMwmRecyclerFragment @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); if (getArguments() != null && getArguments().containsKey(FeatureCategoryActivity.EXTRA_FEATURE_CATEGORY)) mSelectedCategory = getArguments().getParcelable(FeatureCategoryActivity.EXTRA_FEATURE_CATEGORY); diff --git a/android/src/com/mapswithme/maps/editor/StreetFragment.java b/android/src/com/mapswithme/maps/editor/StreetFragment.java index c4a5addd03..7f233ebb8f 100644 --- a/android/src/com/mapswithme/maps/editor/StreetFragment.java +++ b/android/src/com/mapswithme/maps/editor/StreetFragment.java @@ -25,10 +25,10 @@ public class StreetFragment extends BaseMwmRecyclerFragment implements EditTextD @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { mSelectedString = Editor.nativeGetStreet(); - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); } @Override diff --git a/android/src/com/mapswithme/maps/news/BaseNewsFragment.java b/android/src/com/mapswithme/maps/news/BaseNewsFragment.java index 7b155fad2b..ff48ae8d4e 100644 --- a/android/src/com/mapswithme/maps/news/BaseNewsFragment.java +++ b/android/src/com/mapswithme/maps/news/BaseNewsFragment.java @@ -5,7 +5,9 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.os.Bundle; import android.support.annotation.ArrayRes; +import android.support.annotation.CallSuper; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; @@ -39,6 +41,9 @@ public abstract class BaseNewsFragment extends BaseMwmDialogFragment private int mPageCount; + @Nullable + private NewsDialogListener mListener; + abstract class Adapter extends PagerAdapter { private final int[] mImages; @@ -285,18 +290,23 @@ public abstract class BaseNewsFragment extends BaseMwmDialogFragment return res; } + @CallSuper protected void onDoneClick() { dismissAllowingStateLoss(); + if (mListener != null) + mListener.onDialogDone(); } @SuppressWarnings("TryWithIdenticalCatches") static void create(@NonNull FragmentActivity activity, - @NonNull Class clazz) + @NonNull Class clazz, + @Nullable NewsDialogListener listener) { try { final BaseNewsFragment fragment = clazz.newInstance(); + fragment.mListener = listener; activity.getSupportFragmentManager() .beginTransaction() .add(fragment, clazz.getName()) @@ -321,4 +331,9 @@ public abstract class BaseNewsFragment extends BaseMwmDialogFragment fm.executePendingTransactions(); return true; } + + public interface NewsDialogListener + { + void onDialogDone(); + } } diff --git a/android/src/com/mapswithme/maps/news/FirstStartFragment.java b/android/src/com/mapswithme/maps/news/FirstStartFragment.java index 0de3368533..26c29cc8a4 100644 --- a/android/src/com/mapswithme/maps/news/FirstStartFragment.java +++ b/android/src/com/mapswithme/maps/news/FirstStartFragment.java @@ -3,13 +3,14 @@ package com.mapswithme.maps.news; import android.app.Dialog; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import com.mapswithme.maps.BuildConfig; import com.mapswithme.maps.R; import com.mapswithme.maps.location.LocationHelper; -import com.mapswithme.util.Config; +import com.mapswithme.util.Counters; public class FirstStartFragment extends BaseNewsFragment { @@ -73,22 +74,23 @@ public class FirstStartFragment extends BaseNewsFragment LocationHelper.INSTANCE.onExitFromFirstRun(); } - public static boolean showOn(@NonNull FragmentActivity activity) + public static boolean showOn(@NonNull FragmentActivity activity, + @Nullable NewsDialogListener listener) { - if (Config.getFirstInstallVersion() < BuildConfig.VERSION_CODE) + if (Counters.getFirstInstallVersion() < BuildConfig.VERSION_CODE) return false; FragmentManager fm = activity.getSupportFragmentManager(); if (fm.isDestroyed()) return false; - if (Config.isFirstStartDialogSeen() && + if (Counters.isFirstStartDialogSeen() && !recreate(activity, FirstStartFragment.class)) return false; - create(activity, FirstStartFragment.class); + create(activity, FirstStartFragment.class, listener); - Config.setFirstStartDialogSeen(); + Counters.setFirstStartDialogSeen(); return true; } } diff --git a/android/src/com/mapswithme/maps/news/NewsFragment.java b/android/src/com/mapswithme/maps/news/NewsFragment.java index 42c9d6a74b..9c33ee7281 100644 --- a/android/src/com/mapswithme/maps/news/NewsFragment.java +++ b/android/src/com/mapswithme/maps/news/NewsFragment.java @@ -1,6 +1,7 @@ package com.mapswithme.maps.news; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; @@ -8,8 +9,8 @@ import com.mapswithme.maps.BuildConfig; import com.mapswithme.maps.MwmApplication; import com.mapswithme.maps.R; import com.mapswithme.maps.downloader.UpdaterDialogFragment; -import com.mapswithme.util.Config; import com.mapswithme.util.concurrency.UiThread; +import com.mapswithme.util.Counters; public class NewsFragment extends BaseNewsFragment { @@ -91,22 +92,23 @@ public class NewsFragment extends BaseNewsFragment * Displays "What's new" dialog on given {@code activity}. Or not. * @return whether "What's new" dialog should be shown. */ - public static boolean showOn(@NonNull FragmentActivity activity) + public static boolean showOn(@NonNull FragmentActivity activity, + @Nullable NewsDialogListener listener) { - if (Config.getFirstInstallVersion() >= BuildConfig.VERSION_CODE) + if (Counters.getFirstInstallVersion() >= BuildConfig.VERSION_CODE) return false; FragmentManager fm = activity.getSupportFragmentManager(); if (fm.isDestroyed()) return false; - if (Config.getLastWhatsNewVersion() / 10 >= BuildConfig.VERSION_CODE / 10 && + if (Counters.getLastWhatsNewVersion() / 10 >= BuildConfig.VERSION_CODE / 10 && !recreate(activity, NewsFragment.class)) return false; - create(activity, NewsFragment.class); + create(activity, NewsFragment.class, listener); - Config.setWhatsNewShown(); + Counters.setWhatsNewShown(); return true; } } diff --git a/android/src/com/mapswithme/maps/search/SearchFragment.java b/android/src/com/mapswithme/maps/search/SearchFragment.java index 627ab2bd6f..79e62919cc 100644 --- a/android/src/com/mapswithme/maps/search/SearchFragment.java +++ b/android/src/com/mapswithme/maps/search/SearchFragment.java @@ -288,9 +288,9 @@ public class SearchFragment extends BaseMwmFragment @CallSuper @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); readArguments(); ViewGroup root = (ViewGroup) view; @@ -390,8 +390,9 @@ public class SearchFragment extends BaseMwmFragment } - protected void safeOnResume() + public void onResume() { + super.onResume(); LocationHelper.INSTANCE.addListener(mLocationListener, true); mAppBarLayout.addOnOffsetChangedListener(mOffsetListener); } diff --git a/android/src/com/mapswithme/maps/search/SearchHistoryFragment.java b/android/src/com/mapswithme/maps/search/SearchHistoryFragment.java index e9ae159e44..4f22c99985 100644 --- a/android/src/com/mapswithme/maps/search/SearchHistoryFragment.java +++ b/android/src/com/mapswithme/maps/search/SearchHistoryFragment.java @@ -36,9 +36,9 @@ public class SearchHistoryFragment extends BaseMwmRecyclerFragment } @Override - protected void safeOnViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.safeOnViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); getRecyclerView().setLayoutManager(new LinearLayoutManager(view.getContext())); mPlaceHolder = (PlaceholderView) view.findViewById(R.id.placeholder); mPlaceHolder.setContent(R.drawable.img_search_empty_history_light, @@ -60,8 +60,9 @@ public class SearchHistoryFragment extends BaseMwmRecyclerFragment @CallSuper @Override - protected void safeOnActivityCreated(@Nullable Bundle savedInstanceState) + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); ((SearchFragment) getParentFragment()).setRecyclerScrollListener(getRecyclerView()); } } diff --git a/android/src/com/mapswithme/maps/widget/placepage/EditBookmarkFragment.java b/android/src/com/mapswithme/maps/widget/placepage/EditBookmarkFragment.java index 4357cf1f12..9972ebb66c 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/EditBookmarkFragment.java +++ b/android/src/com/mapswithme/maps/widget/placepage/EditBookmarkFragment.java @@ -78,7 +78,7 @@ public class EditBookmarkFragment extends BaseMwmDialogFragment implements View. } @Override - protected void safeOnViewCreated(@NonNull View view, Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { final Bundle args = getArguments(); mCategoryId = args.getInt(EXTRA_CATEGORY_ID); diff --git a/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java b/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java index ab2e584d85..eda3ad6efb 100644 --- a/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java +++ b/android/src/com/mapswithme/maps/widget/placepage/EditDescriptionFragment.java @@ -50,7 +50,7 @@ public class EditDescriptionFragment extends BaseMwmDialogFragment } @Override - protected void safeOnViewCreated(@NonNull View view, Bundle savedInstanceState) + public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { mBookmark = getArguments().getParcelable(EXTRA_BOOKMARK); String description = null; diff --git a/android/src/com/mapswithme/util/Config.java b/android/src/com/mapswithme/util/Config.java index 03f511bc8a..2b6092ddee 100644 --- a/android/src/com/mapswithme/util/Config.java +++ b/android/src/com/mapswithme/util/Config.java @@ -1,19 +1,11 @@ package com.mapswithme.util; import android.support.annotation.NonNull; -import android.support.v4.app.DialogFragment; -import android.text.TextUtils; -import android.text.format.DateUtils; -import com.mapswithme.maps.BuildConfig; +import com.mapswithme.maps.MwmApplication; public final class Config { - private static final String KEY_APP_FIRST_INSTALL_VERSION = "FirstInstallVersion"; - private static final String KEY_APP_LAUNCH_NUMBER = "LaunchNumber"; - private static final String KEY_APP_SESSION_NUMBER = "SessionNumber"; - private static final String KEY_APP_LAST_SESSION_TIMESTAMP = "LastSessionTimestamp"; - private static final String KEY_APP_FIRST_INSTALL_FLAVOR = "FirstInstallFlavor"; private static final String KEY_APP_STORAGE = "StoragePath"; private static final String KEY_TTS_ENABLED = "TtsEnabled"; @@ -25,13 +17,8 @@ public final class Config private static final String KEY_PREF_STATISTICS = "StatisticsEnabled"; private static final String KEY_PREF_USE_GS = "UseGoogleServices"; - private static final String KEY_LIKES_RATED_DIALOG = "RatedDialog"; - private static final String KEY_LIKES_LAST_RATED_SESSION = "LastRatedSession"; - private static final String KEY_MISC_DISCLAIMER_ACCEPTED = "IsDisclaimerApproved"; private static final String KEY_MISC_KITKAT_MIGRATED = "KitKatMigrationCompleted"; - private static final String KEY_MISC_NEWS_LAST_VERSION = "WhatsNewShownVersion"; - private static final String KEY_MISC_FIRST_START_DIALOG_SEEN = "FirstStartDialogSeen"; private static final String KEY_MISC_UI_THEME = "UiTheme"; private static final String KEY_MISC_UI_THEME_SETTINGS = "UiThemeSettings"; private static final String KEY_MISC_USE_MOBILE_DATA = "UseMobileData"; @@ -106,83 +93,6 @@ public final class Config nativeSetBoolean(key, value); } - /** - * Increments integer value. - * @return Previous value before increment. - */ - private static int increment(String key) - { - int res = getInt(key); - setInt(key, res + 1); - return res; - } - - public static int getFirstInstallVersion() - { - return getInt(KEY_APP_FIRST_INSTALL_VERSION); - } - - /** - * Increments counter of app starts. - * @return Previous value before increment. - */ - private static int incrementLaunchNumber() - { - return increment(KEY_APP_LAUNCH_NUMBER); - } - - /** - * Session = single day, when app was started any number of times. - */ - public static int getSessionCount() - { - return getInt(KEY_APP_SESSION_NUMBER); - } - - private static void incrementSessionNumber() - { - long lastSessionTimestamp = getLong(KEY_APP_LAST_SESSION_TIMESTAMP); - if (DateUtils.isToday(lastSessionTimestamp)) - return; - - setLong(KEY_APP_LAST_SESSION_TIMESTAMP, System.currentTimeMillis()); - increment(KEY_APP_SESSION_NUMBER); - } - - public static void resetAppSessionCounters() - { - setInt(KEY_APP_LAUNCH_NUMBER, 0); - setInt(KEY_APP_SESSION_NUMBER, 0); - setLong(KEY_APP_LAST_SESSION_TIMESTAMP, 0L); - setInt(KEY_LIKES_LAST_RATED_SESSION, 0); - incrementSessionNumber(); - } - - public static String getInstallFlavor() - { - return getString(KEY_APP_FIRST_INSTALL_FLAVOR); - } - - private static void updateInstallFlavor() - { - String installedFlavor = getInstallFlavor(); - if (TextUtils.isEmpty(installedFlavor)) - setString(KEY_APP_FIRST_INSTALL_FLAVOR, BuildConfig.FLAVOR); - } - - public static void updateLaunchCounter() - { - if (incrementLaunchNumber() == 0) - { - if (getFirstInstallVersion() == 0) - setInt(KEY_APP_FIRST_INSTALL_VERSION, BuildConfig.VERSION_CODE); - - updateInstallFlavor(); - } - - incrementSessionNumber(); - } - public static String getStoragePath() { return getString(KEY_APP_STORAGE); @@ -235,12 +145,12 @@ public final class Config public static boolean isStatisticsEnabled() { - return getBool(KEY_PREF_STATISTICS, true); + return MwmApplication.prefs().getBoolean(KEY_PREF_STATISTICS, true); } public static void setStatisticsEnabled(boolean enabled) { - setBool(KEY_PREF_STATISTICS, enabled); + MwmApplication.prefs().edit().putBoolean(KEY_PREF_STATISTICS, enabled).apply(); } public static boolean useGoogleServices() @@ -253,26 +163,6 @@ public final class Config setBool(KEY_PREF_USE_GS, use); } - public static boolean isRatingApplied(Class dialogFragmentClass) - { - return getBool(KEY_LIKES_RATED_DIALOG + dialogFragmentClass.getSimpleName()); - } - - public static void setRatingApplied(Class dialogFragmentClass) - { - setBool(KEY_LIKES_RATED_DIALOG + dialogFragmentClass.getSimpleName()); - } - - public static boolean isSessionRated(int session) - { - return (getInt(KEY_LIKES_LAST_RATED_SESSION) >= session); - } - - public static void setRatedSession(int session) - { - setInt(KEY_LIKES_LAST_RATED_SESSION, session); - } - public static boolean isRoutingDisclaimerAccepted() { return getBool(KEY_MISC_DISCLAIMER_ACCEPTED); @@ -293,26 +183,6 @@ public final class Config setBool(KEY_MISC_KITKAT_MIGRATED); } - public static int getLastWhatsNewVersion() - { - return getInt(KEY_MISC_NEWS_LAST_VERSION); - } - - public static void setWhatsNewShown() - { - setInt(KEY_MISC_NEWS_LAST_VERSION, BuildConfig.VERSION_CODE); - } - - public static boolean isFirstStartDialogSeen() - { - return getBool(KEY_MISC_FIRST_START_DIALOG_SEEN); - } - - public static void setFirstStartDialogSeen() - { - setBool(KEY_MISC_FIRST_START_DIALOG_SEEN); - } - @NonNull public static String getCurrentUiTheme() { diff --git a/android/src/com/mapswithme/util/Counters.java b/android/src/com/mapswithme/util/Counters.java new file mode 100644 index 0000000000..91f8bfee34 --- /dev/null +++ b/android/src/com/mapswithme/util/Counters.java @@ -0,0 +1,176 @@ +package com.mapswithme.util; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v4.app.DialogFragment; +import android.support.v7.preference.PreferenceManager; +import android.text.TextUtils; +import android.text.format.DateUtils; + +import com.mapswithme.maps.BuildConfig; +import com.mapswithme.maps.MwmApplication; +import com.mapswithme.maps.R; + +public final class Counters +{ + private static final String KEY_APP_LAUNCH_NUMBER = "LaunchNumber"; + private static final String KEY_APP_FIRST_INSTALL_VERSION = "FirstInstallVersion"; + private static final String KEY_APP_FIRST_INSTALL_FLAVOR = "FirstInstallFlavor"; + private static final String KEY_APP_LAST_SESSION_TIMESTAMP = "LastSessionTimestamp"; + private static final String KEY_APP_SESSION_NUMBER = "SessionNumber"; + private static final String KEY_MISC_FIRST_START_DIALOG_SEEN = "FirstStartDialogSeen"; + private static final String KEY_MISC_NEWS_LAST_VERSION = "WhatsNewShownVersion"; + private static final String KEY_LIKES_LAST_RATED_SESSION = "LastRatedSession"; + + private static final String KEY_LIKES_RATED_DIALOG = "RatedDialog"; + + private Counters() {} + + public static void initCounters(@NonNull Context context) + { + PreferenceManager.setDefaultValues(context, R.xml.prefs_main, false); + updateLaunchCounter(); + } + + public static int getFirstInstallVersion() + { + return MwmApplication.prefs().getInt(KEY_APP_FIRST_INSTALL_VERSION, 0); + } + + public static boolean isFirstStartDialogSeen() + { + return MwmApplication.prefs().getBoolean(KEY_MISC_FIRST_START_DIALOG_SEEN, false); + } + + public static void setFirstStartDialogSeen() + { + MwmApplication.prefs() + .edit() + .putBoolean(KEY_MISC_FIRST_START_DIALOG_SEEN, true) + .apply(); + } + + public static int getLastWhatsNewVersion() + { + return MwmApplication.prefs().getInt(KEY_MISC_NEWS_LAST_VERSION, 0); + } + + public static void setWhatsNewShown() + { + MwmApplication.prefs() + .edit() + .putInt(KEY_MISC_NEWS_LAST_VERSION, BuildConfig.VERSION_CODE) + .apply(); + } + + public static void resetAppSessionCounters() + { + MwmApplication.prefs() + .edit() + .putInt(KEY_APP_LAUNCH_NUMBER, 0) + .putInt(KEY_APP_SESSION_NUMBER, 0) + .putLong(KEY_APP_LAST_SESSION_TIMESTAMP, 0L) + .putInt(KEY_LIKES_LAST_RATED_SESSION, 0) + .apply(); + incrementSessionNumber(); + } + + public static boolean isSessionRated(int session) + { + return (MwmApplication.prefs().getInt(KEY_LIKES_LAST_RATED_SESSION, 0) >= session); + } + + public static void setRatedSession(int session) + { + MwmApplication.prefs() + .edit() + .putInt(KEY_LIKES_LAST_RATED_SESSION, session) + .apply(); + } + + /** + * Session = single day, when app was started any number of times. + */ + public static int getSessionCount() + { + return MwmApplication.prefs().getInt(KEY_APP_SESSION_NUMBER, 0); + } + + public static boolean isRatingApplied(Class dialogFragmentClass) + { + return MwmApplication.prefs() + .getBoolean(KEY_LIKES_RATED_DIALOG + dialogFragmentClass.getSimpleName(), + false); + } + + public static void setRatingApplied(Class dialogFragmentClass) + { + MwmApplication.prefs() + .edit() + .putBoolean(KEY_LIKES_RATED_DIALOG + dialogFragmentClass.getSimpleName(), true) + .apply(); + } + + public static String getInstallFlavor() + { + return MwmApplication.prefs().getString(KEY_APP_FIRST_INSTALL_FLAVOR, ""); + } + + private static void updateLaunchCounter() + { + if (incrementLaunchNumber() == 0) + { + if (getFirstInstallVersion() == 0) + { + MwmApplication.prefs() + .edit() + .putInt(KEY_APP_FIRST_INSTALL_VERSION, BuildConfig.VERSION_CODE) + .apply(); + } + + updateInstallFlavor(); + } + + incrementSessionNumber(); + } + + private static int incrementLaunchNumber() + { + return increment(KEY_APP_LAUNCH_NUMBER); + } + + private static void updateInstallFlavor() + { + String installedFlavor = getInstallFlavor(); + if (TextUtils.isEmpty(installedFlavor)) + { + MwmApplication.prefs() + .edit() + .putString(KEY_APP_FIRST_INSTALL_FLAVOR, BuildConfig.FLAVOR) + .apply(); + } + } + + private static void incrementSessionNumber() + { + long lastSessionTimestamp = MwmApplication.prefs().getLong(KEY_APP_LAST_SESSION_TIMESTAMP, 0); + if (DateUtils.isToday(lastSessionTimestamp)) + return; + + MwmApplication.prefs() + .edit() + .putLong(KEY_APP_LAST_SESSION_TIMESTAMP, System.currentTimeMillis()) + .apply(); + increment(KEY_APP_SESSION_NUMBER); + } + + private static int increment(@NonNull String key) + { + int value = MwmApplication.prefs().getInt(key, 0); + MwmApplication.prefs() + .edit() + .putInt(key, ++value) + .apply(); + return value; + } +} diff --git a/android/src/com/mapswithme/util/MultipleTrackerReferrerReceiver.java b/android/src/com/mapswithme/util/MultipleTrackerReferrerReceiver.java index b2ef57e552..17c62ecf33 100644 --- a/android/src/com/mapswithme/util/MultipleTrackerReferrerReceiver.java +++ b/android/src/com/mapswithme/util/MultipleTrackerReferrerReceiver.java @@ -16,7 +16,7 @@ public class MultipleTrackerReferrerReceiver extends BroadcastReceiver @Override public void onReceive(Context context, Intent intent) { - MwmApplication.get().initCounters(); + Counters.initCounters(context); // parse & send referrer to Aloha try { diff --git a/android/src/com/mapswithme/util/Utils.java b/android/src/com/mapswithme/util/Utils.java index e06afe70da..737761dbc4 100644 --- a/android/src/com/mapswithme/util/Utils.java +++ b/android/src/com/mapswithme/util/Utils.java @@ -413,8 +413,7 @@ public class Utils } } - public static boolean checkPermissions(@NonNull Activity activity, @NonNull String[] permissions, - int requestCode) + public static boolean checkPermissions(@NonNull Activity activity, @NonNull String[] permissions) { if (Build.VERSION.SDK_INT >= 23) { @@ -425,15 +424,7 @@ public class Utils if (!isGranted) break; } - if (isGranted) - { - return true; - } - else - { - ActivityCompat.requestPermissions(activity, permissions, requestCode); - return false; - } + return isGranted; } //permission is automatically granted on sdk<23 upon installation diff --git a/android/src/com/mapswithme/util/statistics/Statistics.java b/android/src/com/mapswithme/util/statistics/Statistics.java index e2e7bfb70d..c9448c9ad2 100644 --- a/android/src/com/mapswithme/util/statistics/Statistics.java +++ b/android/src/com/mapswithme/util/statistics/Statistics.java @@ -28,6 +28,7 @@ import com.mapswithme.maps.location.LocationHelper; import com.mapswithme.maps.widget.placepage.Sponsored; import com.mapswithme.util.Config; import com.mapswithme.util.ConnectionState; +import com.mapswithme.util.Counters; import java.util.ArrayList; import java.util.HashMap; @@ -381,7 +382,7 @@ public enum Statistics Config.setStatisticsEnabled(isEnabled); // We track if user turned on/off statistics to understand data better. - trackEvent(EventName.STATISTICS_STATUS_CHANGED + " " + Config.getInstallFlavor(), + trackEvent(EventName.STATISTICS_STATUS_CHANGED + " " + Counters.getInstallFlavor(), params().add(EventParam.ENABLED, String.valueOf(isEnabled))); }