Merge "Show ImportExportDialogFragment based on tabs" into ub-contactsdialer-a-dev
diff --git a/src/com/android/dialer/DialtactsActivity.java b/src/com/android/dialer/DialtactsActivity.java
index c8ef9b0..6f8f341 100644
--- a/src/com/android/dialer/DialtactsActivity.java
+++ b/src/com/android/dialer/DialtactsActivity.java
@@ -158,8 +158,6 @@
      */
     private SmartDialSearchFragment mSmartDialSearchFragment;
 
-    private boolean mIsVisible;
-
     /**
      * Animation that slides in.
      */
@@ -564,25 +562,6 @@
     }
 
     @Override
-    protected void onStart() {
-        super.onStart();
-        mIsVisible = true;
-    }
-
-    @Override
-    protected void onStop() {
-        mIsVisible = false;
-        super.onStop();
-    }
-
-    /**
-     * Returns true when the Activity is currently visible (between onStart and onStop).
-     */
-    /* package */ boolean isVisible() {
-        return mIsVisible;
-    }
-
-    @Override
     protected void onPause() {
         if (mClearSearchOnPause) {
             hideDialpadAndSearchUi();
@@ -596,7 +575,6 @@
 
     @Override
     protected void onSaveInstanceState(Bundle outState) {
-        mIsVisible = false;
         super.onSaveInstanceState(outState);
         outState.putString(KEY_SEARCH_QUERY, mSearchQuery);
         outState.putBoolean(KEY_IN_REGULAR_SEARCH_UI, mInRegularSearch);
@@ -669,7 +647,7 @@
 
     @Override
     public boolean onMenuItemClick(MenuItem item) {
-        if (!isVisible()) {
+        if (!isSafeToCommitTransactions()) {
             return true;
         }
 
diff --git a/src/com/android/dialer/calllog/CallLogActivity.java b/src/com/android/dialer/calllog/CallLogActivity.java
index ad795f9..2bcd8d4 100644
--- a/src/com/android/dialer/calllog/CallLogActivity.java
+++ b/src/com/android/dialer/calllog/CallLogActivity.java
@@ -27,7 +27,6 @@
 import android.support.v13.app.FragmentPagerAdapter;
 import android.support.v4.view.ViewPager;
 import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -40,16 +39,15 @@
 import com.android.contacts.commonbind.analytics.AnalyticsUtil;
 import com.android.dialer.DialtactsActivity;
 import com.android.dialer.R;
+import com.android.dialer.TransactionSafeActivity;
 
-public class CallLogActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener {
+public class CallLogActivity extends TransactionSafeActivity implements ViewPager.OnPageChangeListener {
     private ViewPager mViewPager;
     private ViewPagerTabs mViewPagerTabs;
     private ViewPagerAdapter mViewPagerAdapter;
     private CallLogFragment mAllCallsFragment;
     private CallLogFragment mMissedCallsFragment;
 
-    private boolean mIsVisible;
-
     private String[] mTabTitles;
 
     private static final int TAB_INDEX_ALL = 0;
@@ -163,31 +161,6 @@
     }
 
     @Override
-    protected void onStart() {
-        super.onStart();
-        mIsVisible = false;
-    }
-
-    @Override
-    protected void onStop() {
-        mIsVisible = false;
-        super.onStop();
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        mIsVisible = false;
-        super.onSaveInstanceState(outState);
-    }
-
-    /**
-     * Returns true when the Activity is currently visible (between onStart and onStop).
-     */
-    /* package */ boolean isVisible() {
-        return mIsVisible;
-    }
-
-    @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         final MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.call_log_options, menu);
@@ -207,7 +180,7 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        if (!isVisible()) {
+        if (!isSafeToCommitTransactions()) {
             return true;
         }
 
diff --git a/src/com/android/dialer/settings/AppCompatPreferenceActivity.java b/src/com/android/dialer/settings/AppCompatPreferenceActivity.java
index 804d477..4e5d9c9 100644
--- a/src/com/android/dialer/settings/AppCompatPreferenceActivity.java
+++ b/src/com/android/dialer/settings/AppCompatPreferenceActivity.java
@@ -32,11 +32,14 @@
 public class AppCompatPreferenceActivity extends PreferenceActivity {
     private AppCompatDelegate mDelegate;
 
+    private boolean mIsSafeToCommitTransactions;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         getDelegate().installViewFactory();
         getDelegate().onCreate(savedInstanceState);
         super.onCreate(savedInstanceState);
+        mIsSafeToCommitTransactions = true;
     }
 
     @Override
@@ -119,4 +122,34 @@
         }
         return mDelegate;
     }
+
+    @Override
+    protected void onStart() {
+        super.onStart();
+        mIsSafeToCommitTransactions = true;
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        mIsSafeToCommitTransactions = true;
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        mIsSafeToCommitTransactions = false;
+    }
+
+    /**
+     * Returns true if it is safe to commit {@link FragmentTransaction}s at this time, based on
+     * whether {@link Activity#onSaveInstanceState} has been called or not.
+     *
+     * Make sure that the current activity calls into
+     * {@link super.onSaveInstanceState(Bundle outState)} (if that method is overridden),
+     * so the flag is properly set.
+     */
+    public boolean isSafeToCommitTransactions() {
+        return mIsSafeToCommitTransactions;
+    }
 }
diff --git a/src/com/android/dialer/settings/DialerSettingsActivity.java b/src/com/android/dialer/settings/DialerSettingsActivity.java
index fee0fa8..58b0ab8 100644
--- a/src/com/android/dialer/settings/DialerSettingsActivity.java
+++ b/src/com/android/dialer/settings/DialerSettingsActivity.java
@@ -35,8 +35,6 @@
 public class DialerSettingsActivity extends AppCompatPreferenceActivity {
     protected SharedPreferences mPreferences;
 
-    private boolean mIsVisible;
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -44,31 +42,6 @@
     }
 
     @Override
-    protected void onStart() {
-        super.onStart();
-        mIsVisible = true;
-    }
-
-    @Override
-    protected void onStop() {
-        mIsVisible = false;
-        super.onStop();
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle out) {
-        mIsVisible = false;
-        super.onSaveInstanceState(out);
-    }
-
-    /**
-     * Returns true when the Activity is currently visible (between onStart and onStop).
-     */
-    /* package */ boolean isVisible() {
-        return mIsVisible;
-    }
-
-    @Override
     public void onBuildHeaders(List<Header> target) {
         Header displayOptionsHeader = new Header();
         displayOptionsHeader.titleRes = R.string.display_options_title;
@@ -159,7 +132,7 @@
 
     @Override
     public void onBackPressed() {
-        if (!isVisible()) {
+        if (!isSafeToCommitTransactions()) {
             return;
         }
         super.onBackPressed();
diff --git a/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java b/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java
index 5184930..c8d6403 100644
--- a/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java
+++ b/tests/src/com/android/dialer/database/FilteredNumberProviderTest.java
@@ -119,7 +119,7 @@
         // Delete row
         int rows = mResolver.delete(
                 FilteredNumberContract.FilteredNumber.CONTENT_URI,
-                "id = ?",
+                FilteredNumberContract.FilteredNumberColumns._ID + " = ?",
                 new String[]{Long.toString(id)});
         assertEquals(rows, 1);