fixed account migration

This commit is contained in:
Mariotaku Lee 2016-12-06 09:26:53 +08:00
parent ed4e1540e0
commit a9f6cc5229
11 changed files with 67 additions and 33 deletions

View File

@ -203,7 +203,6 @@ public interface TwidereConstants extends SharedPreferenceConstants, IntentConst
int TABLE_ID_CACHED_STATUSES = 62; int TABLE_ID_CACHED_STATUSES = 62;
int TABLE_ID_CACHED_HASHTAGS = 63; int TABLE_ID_CACHED_HASHTAGS = 63;
int TABLE_ID_CACHED_RELATIONSHIPS = 64; int TABLE_ID_CACHED_RELATIONSHIPS = 64;
int VIRTUAL_TABLE_ID_DATABASE_READY = 100;
int VIRTUAL_TABLE_ID_NOTIFICATIONS = 101; int VIRTUAL_TABLE_ID_NOTIFICATIONS = 101;
int VIRTUAL_TABLE_ID_PREFERENCES = 102; int VIRTUAL_TABLE_ID_PREFERENCES = 102;
int VIRTUAL_TABLE_ID_ALL_PREFERENCES = 103; 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_AUTO_COMPLETE = 141;
int VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH = 142; 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; int VIRTUAL_TABLE_ID_RAW_QUERY = 300;

View File

@ -51,7 +51,7 @@ public interface TwidereDataStore {
String CONTENT_PATH_RAW_QUERY = "raw_query"; 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) Uri BASE_CONTENT_URI = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
.authority(AUTHORITY).build(); .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_RAW_QUERY = Uri.withAppendedPath(BASE_CONTENT_URI, CONTENT_PATH_RAW_QUERY);
Uri CONTENT_URI_DATABASE_READY = Uri.withAppendedPath(BASE_CONTENT_URI, Uri CONTENT_URI_DATABASE_PREPARE = Uri.withAppendedPath(BASE_CONTENT_URI,
CONTENT_PATH_DATABASE_READY); CONTENT_PATH_DATABASE_PREPARE);
Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, CachedStatuses.CONTENT_URI}; Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, CachedStatuses.CONTENT_URI};
Uri[] CACHE_URIS = new Uri[]{CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI, Uri[] CACHE_URIS = new Uri[]{CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI,

View File

@ -139,6 +139,7 @@ import org.mariotaku.twidere.util.UriExtraUtils;
import org.mariotaku.twidere.util.UserColorNameManager; import org.mariotaku.twidere.util.UserColorNameManager;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.collection.CompactHashSet; 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.dagger.GeneralComponentHelper;
import org.mariotaku.twidere.util.media.preview.PreviewMediaExtractor; import org.mariotaku.twidere.util.media.preview.PreviewMediaExtractor;
import org.mariotaku.twidere.util.net.TwidereDns; 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); final String table = DataStoreUtils.getTableNameById(tableId);
checkReadPermission(tableId, table, projection); checkReadPermission(tableId, table, projection);
switch (tableId) { switch (tableId) {
case VIRTUAL_TABLE_ID_DATABASE_READY: { case VIRTUAL_TABLE_ID_DATABASE_PREPARE: {
if (mDatabaseWrapper.isReady()) mDatabaseWrapper.prepare();
return new MatrixCursor(projection != null ? projection : new String[0]); return new MatrixCursor(projection != null ? projection : new String[0]);
return null;
} }
case VIRTUAL_TABLE_ID_PERMISSIONS: { case VIRTUAL_TABLE_ID_PERMISSIONS: {
final Context context = getContext(); final Context context = getContext();
@ -779,6 +779,9 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
case VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH: { case VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH: {
return getSearchSuggestionCursor(uri); return getSearchSuggestionCursor(uri);
} }
case VIRTUAL_TABLE_ID_NULL: {
return null;
}
case VIRTUAL_TABLE_ID_EMPTY: { case VIRTUAL_TABLE_ID_EMPTY: {
return new MatrixCursor(projection); return new MatrixCursor(projection);
} }
@ -801,7 +804,8 @@ public final class TwidereDataProvider extends ContentProvider implements Consta
private Cursor getSearchSuggestionCursor(Uri uri) { private Cursor getSearchSuggestionCursor(Uri uri) {
final String query = uri.getQueryParameter(QUERY_PARAM_QUERY); 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; if (query == null || accountKey == null) return null;
final boolean emptyQuery = TextUtils.isEmpty(query); final boolean emptyQuery = TextUtils.isEmpty(query);
final String queryEscaped = query.replace("_", "^_"); final String queryEscaped = query.replace("_", "^_");

View File

@ -185,8 +185,6 @@ public class DataStoreUtils implements Constants {
VIRTUAL_TABLE_ID_UNREAD_COUNTS); VIRTUAL_TABLE_ID_UNREAD_COUNTS);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.ByType.CONTENT_PATH + "/*", CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, UnreadCounts.ByType.CONTENT_PATH + "/*",
VIRTUAL_TABLE_ID_UNREAD_COUNTS_BY_TYPE); 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 + "/*", CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_RELATIONSHIP + "/*",
VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP); VIRTUAL_TABLE_ID_CACHED_USERS_WITH_RELATIONSHIP);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, CachedUsers.CONTENT_PATH_WITH_SCORE + "/*", 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); VIRTUAL_TABLE_ID_SUGGESTIONS_AUTO_COMPLETE);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.Search.CONTENT_PATH, CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, Suggestions.Search.CONTENT_PATH,
VIRTUAL_TABLE_ID_SUGGESTIONS_SEARCH); 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, CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_EMPTY,
VIRTUAL_TABLE_ID_EMPTY); VIRTUAL_TABLE_ID_EMPTY);
CONTENT_PROVIDER_URI_MATCHER.addURI(TwidereDataStore.AUTHORITY, TwidereDataStore.CONTENT_PATH_RAW_QUERY + "/*", 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> { interface FieldArrayCreator<T> {
T newArray(int size); T newArray(int size);

View File

@ -60,9 +60,8 @@ public class SQLiteDatabaseWrapper {
mDatabase.execSQL(sql, bindArgs); mDatabase.execSQL(sql, bindArgs);
} }
public boolean isReady() { public void prepare() {
if (mLazyLoadCallback != null) return true; tryCreateDatabase();
return mDatabase != null;
} }
public Cursor query(final String table, final String[] columns, final String selection, public Cursor query(final String table, final String[] columns, final String selection,

View File

@ -337,7 +337,6 @@ public final class Utils implements Constants {
return colors; return colors;
} }
public static class NoAccountException extends Exception { public static class NoAccountException extends Exception {
String accountHost; String accountHost;
@ -559,7 +558,8 @@ public final class Utils implements Constants {
if (context == null) return null; if (context == null) return null;
final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME, final SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE); 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); final UserKey[] accountKeys = DataStoreUtils.getAccountKeys(context);
int idMatchIdx = -1; int idMatchIdx = -1;
for (int i = 0, accountIdsLength = accountKeys.length; i < accountIdsLength; i++) { for (int i = 0, accountIdsLength = accountKeys.length; i < accountIdsLength; i++) {

View File

@ -93,7 +93,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
private var tabColumns: Int = 0 private var tabColumns: Int = 0
private var multiSelectHandler: MultiSelectEventHandler? = null private lateinit var multiSelectHandler: MultiSelectEventHandler
private var pagerAdapter: SupportTabsAdapter? = null private var pagerAdapter: SupportTabsAdapter? = null
@ -145,8 +145,8 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
override fun triggerRefresh(position: Int): Boolean { override fun triggerRefresh(position: Int): Boolean {
val f = pagerAdapter!!.instantiateItem(mainPager, position) as Fragment val f = pagerAdapter!!.instantiateItem(mainPager, position) as Fragment
if (f !is RefreshScrollTopInterface) return false
if (f.activity == null || f.isDetached) return false if (f.activity == null || f.isDetached) return false
if (f !is RefreshScrollTopInterface) return false
return f.triggerRefresh() return f.triggerRefresh()
} }
@ -298,7 +298,8 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
multiSelectHandler = MultiSelectEventHandler(this) multiSelectHandler = MultiSelectEventHandler(this)
multiSelectHandler!!.dispatchOnCreate() multiSelectHandler.dispatchOnCreate()
DataStoreUtils.prepareDatabase(this)
if (!DataStoreUtils.hasAccount(this)) { if (!DataStoreUtils.hasAccount(this)) {
val signInIntent = Intent(INTENT_ACTION_TWITTER_LOGIN) val signInIntent = Intent(INTENT_ACTION_TWITTER_LOGIN)
signInIntent.setClass(this, SignInActivity::class.java) signInIntent.setClass(this, SignInActivity::class.java)
@ -347,7 +348,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
drawerToggleButton.visibility = View.GONE 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) { if (top != oldTop) {
val fragment = leftDrawerFragment val fragment = leftDrawerFragment
if (fragment is AccountsDashboardFragment) { if (fragment is AccountsDashboardFragment) {
@ -388,7 +389,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
multiSelectHandler!!.dispatchOnStart() multiSelectHandler.dispatchOnStart()
val resolver = contentResolver val resolver = contentResolver
resolver.registerContentObserver(Accounts.CONTENT_URI, true, accountChangeObserver) resolver.registerContentObserver(Accounts.CONTENT_URI, true, accountChangeObserver)
bus.register(this) bus.register(this)
@ -408,7 +409,7 @@ class HomeActivity : BaseActivity(), OnClickListener, OnPageChangeListener, Supp
} }
override fun onStop() { override fun onStop() {
multiSelectHandler!!.dispatchOnStop() multiSelectHandler.dispatchOnStop()
readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener) readStateManager.unregisterOnSharedPreferenceChangeListener(readStateChangeListener)
bus.unregister(this) bus.unregister(this)
val resolver = contentResolver val resolver = contentResolver

View File

@ -19,14 +19,13 @@
package org.mariotaku.twidere.activity package org.mariotaku.twidere.activity
import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import org.mariotaku.twidere.BuildConfig import org.mariotaku.twidere.BuildConfig
import org.mariotaku.twidere.util.StrictModeUtils import org.mariotaku.twidere.util.StrictModeUtils
import org.mariotaku.twidere.util.Utils import org.mariotaku.twidere.util.Utils
open class MainActivity : Activity() { open class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
@ -34,14 +33,15 @@ open class MainActivity : Activity() {
StrictModeUtils.detectAllThreadPolicy() StrictModeUtils.detectAllThreadPolicy()
} }
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
if (Utils.checkDeviceCompatible()) { if (!Utils.checkDeviceCompatible()) {
val intent = Intent(this, HomeActivity::class.java) val intent = Intent(this, IncompatibleAlertActivity::class.java)
startActivity(intent) startActivity(intent)
} else { } else {
val intent = Intent(this, IncompatibleAlertActivity::class.java) val intent = Intent(this, HomeActivity::class.java)
startActivity(intent) startActivity(intent)
} }
finish() finish()
} }
} }

View File

@ -118,12 +118,23 @@ class AccountsDashboardFragment : BaseSupportFragment(), LoaderCallbacks<Account
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
val adapter = accountsAdapter ?: return val adapter = accountsAdapter ?: return
val pagePosition = position + positionOffset val pagePosition = position + positionOffset
hasPrevAccountIndicator.alpha = TwidereMathUtils.clamp(pagePosition, 0f, 1f) val pageCount = adapter.count
hasNextAccountIndicator.alpha = TwidereMathUtils.clamp(adapter.count - (pagePosition val visiblePages = 1 / adapter.getPageWidth(position)
+ 1 / adapter.getPageWidth(position)), 0f, 1f) if (pageCount < visiblePages) {
hasPrevAccountIndicator.alpha = 0f
hasNextAccountIndicator.alpha = 0f
} else {
hasPrevAccountIndicator.alpha = TwidereMathUtils.clamp(pagePosition, 0f, 1f)
hasNextAccountIndicator.alpha = TwidereMathUtils.clamp(pageCount - (pagePosition
+ visiblePages), 0f, 1f)
}
} }
}) })
accountsSelector.setPageTransformer(false, AccountsSelectorTransformer) accountsSelector.setPageTransformer(false, AccountsSelectorTransformer)
hasPrevAccountIndicator.alpha = 0f
hasNextAccountIndicator.alpha = 0f
val menuInflater = SupportMenuInflater(context) val menuInflater = SupportMenuInflater(context)
menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, accountDashboardMenu.menu) menuInflater.inflate(R.menu.action_dashboard_timeline_toggle, accountDashboardMenu.menu)
accountDashboardMenu.setOnMenuItemClickListener(OnMenuItemClickListener { item -> accountDashboardMenu.setOnMenuItemClickListener(OnMenuItemClickListener { item ->

View File

@ -23,20 +23,26 @@ import android.app.Dialog
import android.app.ProgressDialog import android.app.ProgressDialog
import android.os.Bundle import android.os.Bundle
import android.support.v4.app.FragmentManager 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.R
import org.mariotaku.twidere.constant.IntentConstants.EXTRA_MESSAGE
class ProgressDialogFragment : BaseDialogFragment() { class ProgressDialogFragment : BaseDialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = ProgressDialog(activity) val dialog = ProgressDialog(activity)
dialog.setMessage(getString(R.string.please_wait)) dialog.setMessage(arguments?.getString(EXTRA_MESSAGE) ?: getString(R.string.please_wait))
return dialog return dialog
} }
companion object { companion object {
fun show(fm: FragmentManager, tag: String): ProgressDialogFragment { fun show(fm: FragmentManager, tag: String, message: String? = null): ProgressDialogFragment {
val f = ProgressDialogFragment() val f = ProgressDialogFragment()
f.arguments = Bundle {
this[EXTRA_MESSAGE] = message
}
f.show(fm, tag) f.show(fm, tag)
return f return f
} }

View File

@ -0,0 +1,5 @@
package org.mariotaku.twidere.model.message
object DatabaseReadyEvent {
}