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_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;

View File

@ -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,

View File

@ -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("_", "^_");

View File

@ -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> {
T newArray(int size);

View File

@ -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,

View File

@ -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++) {

View File

@ -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

View File

@ -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()
}
}

View File

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

View File

@ -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
}

View File

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