diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java index 73e717653..29ecfdf73 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/TwidereConstants.java @@ -203,7 +203,6 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst int TABLE_ID_CACHED_STATUSES = 62; int TABLE_ID_CACHED_HASHTAGS = 63; int TABLE_ID_CACHED_RELATIONSHIPS = 64; - int VIRTUAL_TABLE_ID_DATABASE_READY = 100; int VIRTUAL_TABLE_ID_NOTIFICATIONS = 101; int VIRTUAL_TABLE_ID_PREFERENCES = 102; int VIRTUAL_TABLE_ID_ALL_PREFERENCES = 103; @@ -220,7 +219,9 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst int VIRTUAL_TABLE_ID_SUGGESTIONS_AUTO_COMPLETE = 141; int VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH = 142; - int VIRTUAL_TABLE_ID_EMPTY = 200; + int VIRTUAL_TABLE_ID_NULL = 200; + int VIRTUAL_TABLE_ID_EMPTY = 201; + int VIRTUAL_TABLE_ID_DATABASE_PREPARE = 203; int VIRTUAL_TABLE_ID_RAW_QUERY = 300; diff --git a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java index 0e6460da1..627ebac3e 100644 --- a/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java +++ b/twidere.component.common/src/main/java/org/mariotaku/twidere/provider/TwidereDataStore.java @@ -51,7 +51,7 @@ public interface TwidereDataStore { String CONTENT_PATH_RAW_QUERY = "raw_query"; - String CONTENT_PATH_DATABASE_READY = "database_ready"; + String CONTENT_PATH_DATABASE_PREPARE = "database_prepare"; Uri BASE_CONTENT_URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) .authority(AUTHORITY).build(); @@ -62,8 +62,8 @@ public interface TwidereDataStore { Uri CONTENT_URI_RAW_QUERY = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_RAW_QUERY); - Uri CONTENT_URI_DATABASE_READY = Uri.withAppendedPath(BASE_CONTENT_URI, - CONTENT_PATH_DATABASE_READY); + Uri CONTENT_URI_DATABASE_PREPARE = Uri.withAppendedPath(BASE_CONTENT_URI, + CONTENT_PATH_DATABASE_PREPARE); Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, CachedStatuses.CONTENT_URI}; Uri[] CACHE_URIS = new Uri[]{CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI, diff --git a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java index 1c912c201..639fee88c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java +++ b/twidere/src/main/java/org/mariotaku/twidere/provider/TwidereDataProvider.java @@ -139,6 +139,7 @@ import org.mariotaku.twidere.util.UriExtraUtils; import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.collection.CompactHashSet; +import org.mariotaku.twidere.util.content.TwidereSQLiteOpenHelper; import org.mariotaku.twidere.util.dagger.GeneralComponentHelper; import org.mariotaku.twidere.util.media.preview.PreviewMediaExtractor; import org.mariotaku.twidere.util.net.TwidereDns; @@ -659,10 +660,9 @@ public final class TwidereDataProvider extends ContentProvider implements Consta final String table = DataStoreUtils.getTableNameById(tableId); checkReadPermission(tableId, table, projection); switch (tableId) { - case VIRTUAL_TABLE_ID_DATABASE_READY: { - if (mDatabaseWrapper.isReady()) - return new MatrixCursor(projection != null ? projection : new String[0]); - return null; + case VIRTUAL_TABLE_ID_DATABASE_PREPARE: { + mDatabaseWrapper.prepare(); + return new MatrixCursor(projection != null ? projection : new String[0]); } case VIRTUAL_TABLE_ID_PERMISSIONS: { final Context context = getContext(); @@ -779,6 +779,9 @@ public final class TwidereDataProvider extends ContentProvider implements Consta case VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH: { return getSearchSuggestionCursor(uri); } + case VIRTUAL_TABLE_ID_NULL: { + return null; + } case VIRTUAL_TABLE_ID_EMPTY: { return new MatrixCursor(projection); } @@ -801,7 +804,8 @@ public final class TwidereDataProvider extends ContentProvider implements Consta private Cursor getSearchSuggestionCursor(Uri uri) { final String query = uri.getQueryParameter(QUERY_PARAM_QUERY); - final UserKey accountKey = UserKey.valueOf(uri.getQueryParameter(QUERY_PARAM_ACCOUNT_KEY)); + final String paramAccountKey = uri.getQueryParameter(QUERY_PARAM_ACCOUNT_KEY); + final UserKey accountKey = paramAccountKey != null ? UserKey.valueOf(paramAccountKey) : null; if (query == null || accountKey == null) return null; final boolean emptyQuery = TextUtils.isEmpty(query); final String queryEscaped = query.replace("_", "^_"); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java index 8c64e879b..3cccdaf99 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/DataStoreUtils.java @@ -185,8 +185,6 @@ public class DataStoreUtils implements Constants { VIRTUAL_TABLE_ID_UNREAD_COUNTS); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.ByType.CONTENT_PATH + "/*", VIRTUAL_TABLE_ID_UNREAD_COUNTS_BY_TYPE); - CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_DATABASE_READY, - VIRTUAL_TABLE_ID_DATABASE_READY); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_RELATIONSHIP + "/*", VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_SCORE + "/*", @@ -201,6 +199,10 @@ public class DataStoreUtils implements Constants { VIRTUAL_TABLE_ID_SUGGESTIONS_AUTO_COMPLETE); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.Search.CONTENT_PATH, VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH); + CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_DATABASE_PREPARE, + VIRTUAL_TABLE_ID_DATABASE_PREPARE); + CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_NULL, + VIRTUAL_TABLE_ID_NULL); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_EMPTY, VIRTUAL_TABLE_ID_EMPTY); CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_RAW_QUERY + "/*", @@ -1014,6 +1016,11 @@ public class DataStoreUtils implements Constants { } } + public static void prepareDatabase(@NonNull Context context) { + context.getContentResolver().query(TwidereDataStore.CONTENT_URI_DATABASE_PREPARE, null, + null, null, null); + } + interface FieldArrayCreator { T newArray(int size); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/SQLiteDatabaseWrapper.java b/twidere/src/main/java/org/mariotaku/twidere/util/SQLiteDatabaseWrapper.java index 92aa572e2..d96b15ed5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/SQLiteDatabaseWrapper.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/SQLiteDatabaseWrapper.java @@ -60,9 +60,8 @@ public class SQLiteDatabaseWrapper { mDatabase.execSQL(sql, bindArgs); } - public boolean isReady() { - if (mLazyLoadCallback != null) return true; - return mDatabase != null; + public void prepare() { + tryCreateDatabase(); } public Cursor query(final String table, final String[] columns, final String selection, diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index 69196a7b2..368391ad0 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -337,7 +337,6 @@ public final class Utils implements Constants { return colors; } - public static class NoAccountException extends Exception { String accountHost; @@ -559,7 +558,8 @@ public final class Utils implements Constants { if (context == null) return null; final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); - UserKey accountKey = UserKey.valueOf(prefs.getString(KEY_DEFAULT_ACCOUNT_KEY, null)); + final String string = prefs.getString(KEY_DEFAULT_ACCOUNT_KEY, null); + UserKey accountKey = string != null ? UserKey.valueOf(string) : null; final UserKey[] accountKeys = DataStoreUtils.getAccountKeys(context); int idMatchIdx = -1; for (int i = 0, accountIdsLength = accountKeys.length; i < accountIdsLength; i++) { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt index 93c33217d..b21219620 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/HomeActivity.kt @@ -93,7 +93,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp private var tabColumns: Int = 0 - private var multiSelectHandler: MultiSelectEventHandler? = null + private lateinit var multiSelectHandler: MultiSelectEventHandler private var pagerAdapter: SupportTabsAdapter? = null @@ -145,8 +145,8 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override fun triggerRefresh(position: Int): Boolean { val f = pagerAdapter!!.instantiateItem(mainPager, position) as Fragment - if (f !is RefreshScrollTopInterface) return false if (f.activity == null || f.isDetached) return false + if (f !is RefreshScrollTopInterface) return false return f.triggerRefresh() } @@ -298,7 +298,8 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) multiSelectHandler = MultiSelectEventHandler(this) - multiSelectHandler!!.dispatchOnCreate() + multiSelectHandler.dispatchOnCreate() + DataStoreUtils.prepareDatabase(this) if (!DataStoreUtils.hasAccount(this)) { val signInIntent = Intent(INTENT_ACTION_TWITTER_LOGIN) signInIntent.setClass(this, SignInActivity::class.java) @@ -347,7 +348,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp drawerToggleButton.visibility = View.GONE } - homeContent!!.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom -> + homeContent.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom -> if (top != oldTop) { val fragment = leftDrawerFragment if (fragment is AccountsDashboardFragment) { @@ -388,7 +389,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp override fun onStart() { super.onStart() - multiSelectHandler!!.dispatchOnStart() + multiSelectHandler.dispatchOnStart() val resolver = contentResolver resolver.registerContentObserver(Accounts.CONTENT_URI, true, accountChangeObserver) bus.register(this) @@ -408,7 +409,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp } override fun onStop() { - multiSelectHandler!!.dispatchOnStop() + multiSelectHandler.dispatchOnStop() readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener) bus.unregister(this) val resolver = contentResolver diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt index 61b600f3b..3a1263a79 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/activity/MainActivity.kt @@ -19,14 +19,13 @@ package org.mariotaku.twidere.activity -import android.app.Activity import android.content.Intent import android.os.Bundle import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.util.StrictModeUtils import org.mariotaku.twidere.util.Utils -open class MainActivity : Activity() { +open class MainActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { if (BuildConfig.DEBUG) { @@ -34,14 +33,15 @@ open class MainActivity : Activity() { StrictModeUtils.detectAllThreadPolicy() } super.onCreate(savedInstanceState) - if (Utils.checkDeviceCompatible()) { - val intent = Intent(this, HomeActivity::class.java) + if (!Utils.checkDeviceCompatible()) { + val intent = Intent(this, IncompatibleAlertActivity::class.java) startActivity(intent) } else { - val intent = Intent(this, IncompatibleAlertActivity::class.java) + val intent = Intent(this, HomeActivity::class.java) startActivity(intent) } finish() } } + diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt index e0a6b1149..37c39031f 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/AccountsDashboardFragment.kt @@ -118,12 +118,23 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ProgressDialogFragment.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ProgressDialogFragment.kt index 93e8c5842..31056e6e3 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ProgressDialogFragment.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/fragment/ProgressDialogFragment.kt @@ -23,20 +23,26 @@ import android.app.Dialog import android.app.ProgressDialog import android.os.Bundle import android.support.v4.app.FragmentManager +import org.mariotaku.ktextension.Bundle +import org.mariotaku.ktextension.set import org.mariotaku.twidere.R +import org.mariotaku.twidere.constant.IntentConstants.EXTRA_MESSAGE class ProgressDialogFragment : BaseDialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = ProgressDialog(activity) - dialog.setMessage(getString(R.string.please_wait)) + dialog.setMessage(arguments?.getString(EXTRA_MESSAGE) ?: getString(R.string.please_wait)) return dialog } companion object { - fun show(fm: FragmentManager, tag: String): ProgressDialogFragment { + fun show(fm: FragmentManager, tag: String, message: String? = null): ProgressDialogFragment { val f = ProgressDialogFragment() + f.arguments = Bundle { + this[EXTRA_MESSAGE] = message + } f.show(fm, tag) return f } diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/model/message/DatabaseReadyEvent.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/model/message/DatabaseReadyEvent.kt new file mode 100644 index 000000000..d5c39813d --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/model/message/DatabaseReadyEvent.kt @@ -0,0 +1,5 @@ +package org.mariotaku.twidere.model.message + +object DatabaseReadyEvent { + +} \ No newline at end of file