trying to make twidere work with identi.ca #235

improved L compatibility
This commit is contained in:
Mariotaku Lee 2014-10-25 18:45:50 +08:00
parent 7baf4c95af
commit 03dccdbe43
43 changed files with 1956 additions and 1686 deletions

@ -1 +1 @@
Subproject commit e565ee636888197425aabf17c46a398544ba6dc3 Subproject commit 42c1ffdeb547e4caa9a3a10249912b350453346e

View File

@ -1,4 +1,5 @@
include ':twidere', ':SlidingMenu', ':DragSortListView', ':MenuComponent', ':RefreshNow' include ':twidere', ':twidere.wear'
include ':SlidingMenu', ':DragSortListView', ':MenuComponent', ':RefreshNow'
project(':SlidingMenu').projectDir = file('libraries/SlidingMenu/library') project(':SlidingMenu').projectDir = file('libraries/SlidingMenu/library')
project(':DragSortListView').projectDir = file('libraries/DragSortListView/library') project(':DragSortListView').projectDir = file('libraries/DragSortListView/library')

1
twidere.wear/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/build

32
twidere.wear/build.gradle Normal file
View File

@ -0,0 +1,32 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 20
buildToolsVersion "21.0.2"
defaultConfig {
applicationId "org.mariotaku.twidere"
minSdkVersion 20
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.support:wearable:1.0.0'
compile 'com.google.android.gms:play-services-wearable:6.1.11'
}

17
twidere.wear/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mariotaku.twidere.extension.wear" >
<uses-feature android:name="android.hardware.type.watch" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.DeviceDefault" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -0,0 +1,24 @@
package org.mariotaku.twidere.extension.wear;
import android.app.Activity;
import android.os.Bundle;
import android.support.wearable.view.WatchViewStub;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
@Override
public void onLayoutInflated(WatchViewStub stub) {
mTextView = (TextView) stub.findViewById(R.id.text);
}
});
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.WatchViewStub
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/watch_view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rectLayout="@layout/rect_activity_main"
app:roundLayout="@layout/round_activity_main"
tools:context="org.mariotaku.twidere.extension.wear.MainActivity"
tools:deviceIds="wear">
</android.support.wearable.view.WatchViewStub>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="org.mariotaku.twidere.extension.wear.MainActivity"
tools:deviceIds="wear_square">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_square" />
</LinearLayout>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.mariotaku.twidere.extension.wear.MainActivity"
tools:deviceIds="wear_round">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/hello_round" />
</RelativeLayout>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Twidere Wear Extension</string>
<string name="title_activity_main">MainActivity</string>
<string name="hello_round">Hello Round World!</string>
<string name="hello_square">Hello Square World!</string>
</resources>

View File

@ -2,7 +2,7 @@ apply plugin: 'com.android.application'
android { android {
compileSdkVersion 21 compileSdkVersion 21
buildToolsVersion '21.0.1' buildToolsVersion '21.0.2'
defaultConfig { defaultConfig {
applicationId "org.mariotaku.twidere" applicationId "org.mariotaku.twidere"
@ -69,7 +69,9 @@ android {
} }
dependencies { dependencies {
wearApp project(':twidere.wear')
compile 'com.android.support:support-v13:21.0.0' compile 'com.android.support:support-v13:21.0.0'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.android.support:cardview-v7:21.0.0' compile 'com.android.support:cardview-v7:21.0.0'
compile 'com.android.support:recyclerview-v7:21.0.0' compile 'com.android.support:recyclerview-v7:21.0.0'
compile 'com.google.android.gms:play-services:6.1.11' compile 'com.google.android.gms:play-services:6.1.11'

View File

@ -46,6 +46,7 @@ import org.mariotaku.gallery3d.ui.SynchronizedHandler;
import org.mariotaku.gallery3d.util.GalleryUtils; import org.mariotaku.gallery3d.util.GalleryUtils;
import org.mariotaku.gallery3d.util.ThreadPool; import org.mariotaku.gallery3d.util.ThreadPool;
import org.mariotaku.menucomponent.widget.MenuBar; import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.TwidereSwipeBackActivity; import org.mariotaku.twidere.activity.support.TwidereSwipeBackActivity;
@ -60,7 +61,7 @@ import me.imid.swipebacklayout.lib.SwipeBackLayout.SwipeListener;
public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implements Constants, PhotoView.Listener, public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implements Constants, PhotoView.Listener,
GLImageLoader.DownloadListener, LoaderManager.LoaderCallbacks<GLImageLoader.Result>, OnMenuVisibilityListener, GLImageLoader.DownloadListener, LoaderManager.LoaderCallbacks<GLImageLoader.Result>, OnMenuVisibilityListener,
SwipeListener, OnMenuItemClickListener { SwipeListener, MenuBarListener {
private final GLView mRootPane = new GLView() { private final GLView mRootPane = new GLView() {
@Override @Override
@ -340,7 +341,7 @@ public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implem
if (savedInstanceState == null) { if (savedInstanceState == null) {
loadImage(); loadImage();
} }
mMenuBar.setOnMenuItemClickListener(this); mMenuBar.setMenuBarListener(this);
mMenuBar.inflate(R.menu.menu_image_viewer); mMenuBar.inflate(R.menu.menu_image_viewer);
mMenuBar.setIsBottomBar(true); mMenuBar.setIsBottomBar(true);
mMenuBar.show(); mMenuBar.show();
@ -531,6 +532,11 @@ public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implem
Utils.addIntentToMenu(this, subMenu, shareIntent); Utils.addIntentToMenu(this, subMenu, shareIntent);
} }
@Override
public void onPreShowMenu(Menu menu) {
}
private static class MyHandler extends SynchronizedHandler { private static class MyHandler extends SynchronizedHandler {
ImageViewerGLActivity activity; ImageViewerGLActivity activity;

View File

@ -28,7 +28,7 @@ package org.mariotaku.twidere;
public interface Constants extends TwidereConstants { public interface Constants extends TwidereConstants {
public static final String DATABASES_NAME = "twidere.sqlite"; public static final String DATABASES_NAME = "twidere.sqlite";
public static final int DATABASES_VERSION = 66; public static final int DATABASES_VERSION = 67;
public static final String GOOGLE_MAPS_API_KEY_RELEASE = "0kjPwJOe_zwYjzGc9uYak7vhm_Sf3eob-2L3Xzw"; public static final String GOOGLE_MAPS_API_KEY_RELEASE = "0kjPwJOe_zwYjzGc9uYak7vhm_Sf3eob-2L3Xzw";
public static final String GOOGLE_MAPS_API_KEY_DEBUG = "0kjPwJOe_zwY9p6kT-kygu4mxwysyOOpfkaXqTA"; public static final String GOOGLE_MAPS_API_KEY_DEBUG = "0kjPwJOe_zwY9p6kT-kygu4mxwysyOOpfkaXqTA";

View File

@ -61,10 +61,10 @@ import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment;
import org.mariotaku.twidere.menu.TwidereMenuInflater; import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.model.ParcelableUser; import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.provider.TweetStore.Filters; import org.mariotaku.twidere.provider.TweetStore.Filters;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId; import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
public class FiltersActivity extends BaseSupportActivity implements TabListener, OnPageChangeListener { public class FiltersActivity extends BaseSupportActivity implements TabListener, OnPageChangeListener {
@ -204,7 +204,7 @@ public class FiltersActivity extends BaseSupportActivity implements TabListener,
if (resultCode != RESULT_OK || !(filter instanceof FilteredUsersFragment) || !data.hasExtra(EXTRA_USER)) if (resultCode != RESULT_OK || !(filter instanceof FilteredUsersFragment) || !data.hasExtra(EXTRA_USER))
return; return;
final ParcelableUser user = data.getParcelableExtra(EXTRA_USER); final ParcelableUser user = data.getParcelableExtra(EXTRA_USER);
final ContentValues values = makeFilterdUserContentValues(user); final ContentValues values = ContentValuesCreator.makeFilteredUserContentValues(user);
final ContentResolver resolver = getContentResolver(); final ContentResolver resolver = getContentResolver();
resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null); resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null);
resolver.insert(Filters.Users.CONTENT_URI, values); resolver.insert(Filters.Users.CONTENT_URI, values);

View File

@ -53,7 +53,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
OnClickListener { OnClickListener {
private EditText mEditAPIUrlFormat; private EditText mEditAPIUrlFormat;
private CheckBox mEditSameOAuthSigningUrl; private CheckBox mEditSameOAuthSigningUrl, mEditNoVersionSuffix;
private EditText mEditConsumerKey, mEditConsumerSecret; private EditText mEditConsumerKey, mEditConsumerSecret;
private RadioGroup mEditAuthType; private RadioGroup mEditAuthType;
private RadioButton mButtonOAuth, mButtonxAuth, mButtonBasic, mButtonTwipOMode; private RadioButton mButtonOAuth, mButtonxAuth, mButtonBasic, mButtonTwipOMode;
@ -111,6 +111,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
mAdvancedAPIConfigLabel = (TextView) findViewById(R.id.advanced_api_config_label); mAdvancedAPIConfigLabel = (TextView) findViewById(R.id.advanced_api_config_label);
mAdvancedAPIConfigView = findViewById(R.id.advanced_api_config); mAdvancedAPIConfigView = findViewById(R.id.advanced_api_config);
mEditSameOAuthSigningUrl = (CheckBox) findViewById(R.id.same_oauth_signing_url); mEditSameOAuthSigningUrl = (CheckBox) findViewById(R.id.same_oauth_signing_url);
mEditNoVersionSuffix = (CheckBox) findViewById(R.id.no_version_suffix);
mEditConsumerKey = (EditText) findViewById(R.id.consumer_key); mEditConsumerKey = (EditText) findViewById(R.id.consumer_key);
mEditConsumerSecret = (EditText) findViewById(R.id.consumer_secret); mEditConsumerSecret = (EditText) findViewById(R.id.consumer_secret);
mSaveButton = (Button) findViewById(R.id.save); mSaveButton = (Button) findViewById(R.id.save);
@ -122,11 +123,13 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText()); final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText());
final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId()); final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId());
final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked(); final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked();
final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked();
final String consumerKey = parseString(mEditConsumerKey.getText()); final String consumerKey = parseString(mEditConsumerKey.getText());
final String consumerSecret = parseString(mEditConsumerSecret.getText()); final String consumerSecret = parseString(mEditConsumerSecret.getText());
outState.putString(Accounts.API_URL_FORMAT, apiUrlFormat); outState.putString(Accounts.API_URL_FORMAT, apiUrlFormat);
outState.putInt(Accounts.AUTH_TYPE, authType); outState.putInt(Accounts.AUTH_TYPE, authType);
outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl);
outState.putBoolean(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
outState.putString(Accounts.CONSUMER_KEY, consumerKey); outState.putString(Accounts.CONSUMER_KEY, consumerKey);
outState.putString(Accounts.CONSUMER_SECRET, consumerSecret); outState.putString(Accounts.CONSUMER_SECRET, consumerSecret);
super.onSaveInstanceState(outState); super.onSaveInstanceState(outState);
@ -136,12 +139,14 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText()); final String apiUrlFormat = parseString(mEditAPIUrlFormat.getText());
final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId()); final int authType = getCheckedAuthType(mEditAuthType.getCheckedRadioButtonId());
final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked(); final boolean sameOAuthSigningUrl = mEditSameOAuthSigningUrl.isChecked();
final boolean noVersionSuffix = mEditNoVersionSuffix.isChecked();
final String consumerKey = parseString(mEditConsumerKey.getText()); final String consumerKey = parseString(mEditConsumerKey.getText());
final String consumerSecret = parseString(mEditConsumerSecret.getText()); final String consumerSecret = parseString(mEditConsumerSecret.getText());
final Intent intent = new Intent(); final Intent intent = new Intent();
intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat); intent.putExtra(Accounts.API_URL_FORMAT, apiUrlFormat);
intent.putExtra(Accounts.AUTH_TYPE, authType); intent.putExtra(Accounts.AUTH_TYPE, authType);
intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl);
intent.putExtra(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
intent.putExtra(Accounts.CONSUMER_KEY, consumerKey); intent.putExtra(Accounts.CONSUMER_KEY, consumerKey);
intent.putExtra(Accounts.CONSUMER_SECRET, consumerSecret); intent.putExtra(Accounts.CONSUMER_SECRET, consumerSecret);
setResult(RESULT_OK, intent); setResult(RESULT_OK, intent);
@ -155,13 +160,14 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
String apiUrlFormat; String apiUrlFormat;
int authType; int authType;
boolean sameOAuthSigningUrl; boolean sameOAuthSigningUrl, noVersionSuffix;
String consumerKey, consumerSecret; String consumerKey, consumerSecret;
final SharedPreferences pref = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); final SharedPreferences pref = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final String prefApiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_REST_BASE_URL); final String prefApiUrlFormat = getNonEmptyString(pref, KEY_API_URL_FORMAT, DEFAULT_REST_BASE_URL);
final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); final int prefAuthType = pref.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH);
final boolean prefSameOAuthSigningUrl = pref.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); final boolean prefSameOAuthSigningUrl = pref.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false);
final boolean prefNoVersionSuffix = pref.getBoolean(KEY_NO_VERSION_SUFFIX, false);
final String prefConsumerKey = getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2); final String prefConsumerKey = getNonEmptyString(pref, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2);
final String prefConsumerSecret = getNonEmptyString(pref, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2); final String prefConsumerSecret = getNonEmptyString(pref, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2);
if (savedInstanceState != null) { if (savedInstanceState != null) {
@ -169,6 +175,8 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
authType = savedInstanceState.getInt(Accounts.AUTH_TYPE, prefAuthType); authType = savedInstanceState.getInt(Accounts.AUTH_TYPE, prefAuthType);
sameOAuthSigningUrl = savedInstanceState.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl = savedInstanceState.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL,
prefSameOAuthSigningUrl); prefSameOAuthSigningUrl);
noVersionSuffix = savedInstanceState.getBoolean(Accounts.NO_VERSION_SUFFIX,
prefNoVersionSuffix);
consumerKey = trim(savedInstanceState.getString(Accounts.CONSUMER_KEY, prefConsumerKey)); consumerKey = trim(savedInstanceState.getString(Accounts.CONSUMER_KEY, prefConsumerKey));
consumerSecret = trim(savedInstanceState.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret)); consumerSecret = trim(savedInstanceState.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret));
} else { } else {
@ -177,6 +185,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
apiUrlFormat = trim(extras.getString(Accounts.API_URL_FORMAT, prefApiUrlFormat)); apiUrlFormat = trim(extras.getString(Accounts.API_URL_FORMAT, prefApiUrlFormat));
authType = extras.getInt(Accounts.AUTH_TYPE, prefAuthType); authType = extras.getInt(Accounts.AUTH_TYPE, prefAuthType);
sameOAuthSigningUrl = extras.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL, prefSameOAuthSigningUrl); sameOAuthSigningUrl = extras.getBoolean(Accounts.SAME_OAUTH_SIGNING_URL, prefSameOAuthSigningUrl);
noVersionSuffix = extras.getBoolean(Accounts.NO_VERSION_SUFFIX, prefNoVersionSuffix);
consumerKey = trim(extras.getString(Accounts.CONSUMER_KEY, prefConsumerKey)); consumerKey = trim(extras.getString(Accounts.CONSUMER_KEY, prefConsumerKey));
consumerSecret = trim(extras.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret)); consumerSecret = trim(extras.getString(Accounts.CONSUMER_SECRET, prefConsumerSecret));
} }
@ -188,6 +197,7 @@ public class APIEditorActivity extends BaseSupportDialogActivity implements Twit
mEditAPIUrlFormat.setText(apiUrlFormat); mEditAPIUrlFormat.setText(apiUrlFormat);
mEditSameOAuthSigningUrl.setChecked(sameOAuthSigningUrl); mEditSameOAuthSigningUrl.setChecked(sameOAuthSigningUrl);
mEditNoVersionSuffix.setChecked(noVersionSuffix);
mEditConsumerKey.setText(consumerKey); mEditConsumerKey.setText(consumerKey);
mEditConsumerSecret.setText(consumerSecret); mEditConsumerSecret.setText(consumerSecret);

View File

@ -21,9 +21,13 @@ package org.mariotaku.twidere.activity.support;
import android.app.ActionBar; import android.app.ActionBar;
import android.content.res.Resources; import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NavUtils; import android.support.v4.app.NavUtils;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.Menu; import android.view.Menu;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
@ -143,6 +147,20 @@ public abstract class BaseSupportThemedActivity extends FragmentActivity impleme
super.onStart(); super.onStart();
} }
@Override
protected void onTitleChanged(CharSequence title, int color) {
final SpannableStringBuilder builder = new SpannableStringBuilder(title);
super.onTitleChanged(title, color);
final int themeResId = getCurrentThemeResourceId();
final int themeColor = getThemeColor(), contrastColor = Utils.getContrastYIQ(themeColor, 192);
if (ThemeUtils.isColoredActionBar(themeResId)) {
builder.setSpan(new ForegroundColorSpan(contrastColor), 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
final int titleColor = ThemeUtils.isLightActionBar(themeResId) ? Color.BLACK : Color.WHITE;
builder.setSpan(new ForegroundColorSpan(titleColor), 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();

View File

@ -43,6 +43,7 @@ import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.os.Parcelable; import android.os.Parcelable;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.support.v4.util.LongSparseArray; import android.support.v4.util.LongSparseArray;
import android.text.Editable; import android.text.Editable;
@ -53,7 +54,6 @@ import android.view.KeyEvent;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -78,6 +78,7 @@ import com.twitter.Extractor;
import org.mariotaku.dynamicgridview.DraggableArrayAdapter; import org.mariotaku.dynamicgridview.DraggableArrayAdapter;
import org.mariotaku.menucomponent.widget.MenuBar; import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener;
import org.mariotaku.menucomponent.widget.PopupMenu; import org.mariotaku.menucomponent.widget.PopupMenu;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.BaseArrayAdapter; import org.mariotaku.twidere.adapter.BaseArrayAdapter;
@ -148,7 +149,7 @@ import static org.mariotaku.twidere.util.Utils.showErrorMessage;
import static org.mariotaku.twidere.util.Utils.showMenuItemToast; import static org.mariotaku.twidere.util.Utils.showMenuItemToast;
public class ComposeActivity extends BaseSupportDialogActivity implements TextWatcher, LocationListener, public class ComposeActivity extends BaseSupportDialogActivity implements TextWatcher, LocationListener,
OnMenuItemClickListener, OnClickListener, OnEditorActionListener, OnItemClickListener, OnItemLongClickListener, MenuBarListener, OnClickListener, OnEditorActionListener, OnItemClickListener, OnItemLongClickListener,
OnLongClickListener { OnLongClickListener {
private static final String FAKE_IMAGE_LINK = "https://www.example.com/fake_image.jpg"; private static final String FAKE_IMAGE_LINK = "https://www.example.com/fake_image.jpg";
@ -595,8 +596,8 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
return; return;
} }
mBottomMenuBar.setIsBottomBar(true); mBottomMenuBar.setIsBottomBar(true);
mBottomMenuBar.setOnMenuItemClickListener(this); mBottomMenuBar.setMenuBarListener(this);
mActionMenuBar.setOnMenuItemClickListener(this); mActionMenuBar.setMenuBarListener(this);
mEditText.setOnEditorActionListener(mPreferences.getBoolean(KEY_QUICK_SEND, false) ? this : null); mEditText.setOnEditorActionListener(mPreferences.getBoolean(KEY_QUICK_SEND, false) ? this : null);
mEditText.addTextChangedListener(this); mEditText.addTextChangedListener(this);
mAccountSelectorAdapter = new AccountSelectorAdapter(this); mAccountSelectorAdapter = new AccountSelectorAdapter(this);
@ -1142,7 +1143,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
private void updateTextCount() { private void updateTextCount() {
final StatusTextCountView textCountView = mBottomSendButton ? mBottomSendTextCountView : mSendTextCountView; final StatusTextCountView textCountView = mBottomSendButton ? mBottomSendTextCountView : mSendTextCountView;
if (textCountView != null && mEditText != null) { if (textCountView != null && mEditText != null) {
final String textOrig = mEditText != null ? parseString(mEditText.getText()) : null; final String textOrig = parseString(mEditText.getText());
final String text = hasMedia() && textOrig != null ? mImageUploaderUsed ? getImageUploadStatus(this, final String text = hasMedia() && textOrig != null ? mImageUploaderUsed ? getImageUploadStatus(this,
new String[]{FAKE_IMAGE_LINK}, textOrig) : textOrig + " " + FAKE_IMAGE_LINK : textOrig; new String[]{FAKE_IMAGE_LINK}, textOrig) : textOrig + " " + FAKE_IMAGE_LINK : textOrig;
final int validatedCount = text != null ? mValidator.getTweetLength(text) : 0; final int validatedCount = text != null ? mValidator.getTweetLength(text) : 0;
@ -1150,6 +1151,11 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
} }
} }
@Override
public void onPreShowMenu(Menu menu) {
}
public static class RetweetProtectedStatusWarnFragment extends BaseSupportDialogFragment implements public static class RetweetProtectedStatusWarnFragment extends BaseSupportDialogFragment implements
DialogInterface.OnClickListener { DialogInterface.OnClickListener {
@ -1167,6 +1173,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
} }
@NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
@ -1204,6 +1211,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
} }
@NonNull
@Override @Override
public Dialog onCreateDialog(final Bundle savedInstanceState) { public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity()); final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());

View File

@ -35,6 +35,7 @@ import android.database.ContentObserver;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
@ -228,9 +229,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener
@Override @Override
public void onClick(final View v) { public void onClick(final View v) {
switch (v.getId()) { switch (v.getId()) {
case R.id.actions: case R.id.actions_button: {
case R.id.actions_button:
case R.id.actions_button_bottom: {
triggerActionsClick(); triggerActionsClick();
break; break;
} }
@ -248,7 +247,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener
mSlidingMenu = (HomeSlidingMenu) findViewById(R.id.home_menu); mSlidingMenu = (HomeSlidingMenu) findViewById(R.id.home_menu);
mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager); mViewPager = (ExtendedViewPager) findViewById(R.id.main_pager);
mEmptyTabHint = findViewById(R.id.empty_tab_hint); mEmptyTabHint = findViewById(R.id.empty_tab_hint);
mActionsButton = findViewById(R.id.actions_button_bottom); mActionsButton = findViewById(R.id.actions_button);
mTabsContainer = findViewById(R.id.tabs_container); mTabsContainer = findViewById(R.id.tabs_container);
mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs); mTabIndicator = (TabPagerIndicator) findViewById(R.id.main_tabs);
mActionBarOverlay = findViewById(R.id.actionbar_overlay); mActionBarOverlay = findViewById(R.id.actionbar_overlay);
@ -297,12 +296,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener
@Override @Override
public boolean onLongClick(final View v) { public boolean onLongClick(final View v) {
switch (v.getId()) { switch (v.getId()) {
case R.id.actions:
case R.id.actions_button: { case R.id.actions_button: {
showMenuItemToast(v, v.getContentDescription());
return true;
}
case R.id.actions_button_bottom: {
showMenuItemToast(v, v.getContentDescription(), true); showMenuItemToast(v, v.getContentDescription(), true);
return true; return true;
} }
@ -574,7 +568,7 @@ public class HomeActivity extends BaseSupportActivity implements OnClickListener
final int themeColor = getThemeColor(), contrastColor = Utils.getContrastYIQ(themeColor, 192); final int themeColor = getThemeColor(), contrastColor = Utils.getContrastYIQ(themeColor, 192);
final int themeResId = getCurrentThemeResourceId(); final int themeResId = getCurrentThemeResourceId();
if (ThemeUtils.isColoredActionBar(themeResId)) { if (ThemeUtils.isColoredActionBar(themeResId)) {
mTabIndicator.setBackgroundColor(themeColor); ViewAccessor.setBackground(mTabIndicator, new ColorDrawable(themeColor));
mTabIndicator.setStripColor(contrastColor); mTabIndicator.setStripColor(contrastColor);
mTabIndicator.setIconColor(contrastColor); mTabIndicator.setIconColor(contrastColor);
} else { } else {

View File

@ -120,6 +120,10 @@ public class LinkHandlerActivity extends BaseSupportActivity implements OnClickL
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setUiOptions(getWindow(), data); setUiOptions(getWindow(), data);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.layout_link_handler); setContentView(R.layout.layout_link_handler);
setProgressBarIndeterminateVisibility(false); setProgressBarIndeterminateVisibility(false);
if (data == null || !showFragment(data)) { if (data == null || !showFragment(data)) {
@ -148,11 +152,6 @@ public class LinkHandlerActivity extends BaseSupportActivity implements OnClickL
} }
} }
@Override
protected void onTitleChanged(final CharSequence title, final int color) {
super.onTitleChanged(title, color);
}
private void setUiOptions(final Window window, final Uri data) { private void setUiOptions(final Window window, final Uri data) {
if (FlymeUtils.hasSmartBar()) { if (FlymeUtils.hasSmartBar()) {
window.setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW); window.setUiOptions(ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW);

View File

@ -26,7 +26,6 @@ import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Color; import android.graphics.Color;
@ -35,7 +34,6 @@ import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -116,7 +114,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private ContentResolver mResolver; private ContentResolver mResolver;
private AbstractSignInTask mTask; private AbstractSignInTask mTask;
private boolean mSameOAuthSigningUrl; private boolean mSameOAuthSigningUrl, mNoVersionSuffix;
@Override @Override
public void afterTextChanged(final Editable s) { public void afterTextChanged(final Editable s) {
@ -136,6 +134,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
mAPIUrlFormat = data.getStringExtra(Accounts.API_URL_FORMAT); mAPIUrlFormat = data.getStringExtra(Accounts.API_URL_FORMAT);
mAuthType = data.getIntExtra(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); mAuthType = data.getIntExtra(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH);
mSameOAuthSigningUrl = data.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, false); mSameOAuthSigningUrl = data.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, false);
mNoVersionSuffix = data.getBooleanExtra(Accounts.NO_VERSION_SUFFIX, false);
mConsumerKey = data.getStringExtra(Accounts.CONSUMER_KEY); mConsumerKey = data.getStringExtra(Accounts.CONSUMER_KEY);
mConsumerSecret = data.getStringExtra(Accounts.CONSUMER_SECRET); mConsumerSecret = data.getStringExtra(Accounts.CONSUMER_SECRET);
final boolean isTwipOMode = mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE; final boolean isTwipOMode = mAuthType == Accounts.AUTH_TYPE_TWIP_O_MODE;
@ -263,6 +262,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
intent.putExtra(Accounts.API_URL_FORMAT, mAPIUrlFormat); intent.putExtra(Accounts.API_URL_FORMAT, mAPIUrlFormat);
intent.putExtra(Accounts.AUTH_TYPE, mAuthType); intent.putExtra(Accounts.AUTH_TYPE, mAuthType);
intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, mSameOAuthSigningUrl); intent.putExtra(Accounts.SAME_OAUTH_SIGNING_URL, mSameOAuthSigningUrl);
intent.putExtra(Accounts.NO_VERSION_SUFFIX, mNoVersionSuffix);
intent.putExtra(Accounts.CONSUMER_KEY, mConsumerKey); intent.putExtra(Accounts.CONSUMER_KEY, mConsumerKey);
intent.putExtra(Accounts.CONSUMER_SECRET, mConsumerSecret); intent.putExtra(Accounts.CONSUMER_SECRET, mConsumerSecret);
startActivityForResult(intent, REQUEST_EDIT_API); startActivityForResult(intent, REQUEST_EDIT_API);
@ -305,6 +305,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
outState.putString(Accounts.API_URL_FORMAT, mAPIUrlFormat); outState.putString(Accounts.API_URL_FORMAT, mAPIUrlFormat);
outState.putInt(Accounts.AUTH_TYPE, mAuthType); outState.putInt(Accounts.AUTH_TYPE, mAuthType);
outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, mSameOAuthSigningUrl); outState.putBoolean(Accounts.SAME_OAUTH_SIGNING_URL, mSameOAuthSigningUrl);
outState.putBoolean(Accounts.NO_VERSION_SUFFIX, mNoVersionSuffix);
outState.putString(Accounts.CONSUMER_KEY, mConsumerKey); outState.putString(Accounts.CONSUMER_KEY, mConsumerKey);
outState.putString(Accounts.CONSUMER_SECRET, mConsumerSecret); outState.putString(Accounts.CONSUMER_SECRET, mConsumerSecret);
outState.putString(Accounts.SCREEN_NAME, mUsername); outState.putString(Accounts.SCREEN_NAME, mUsername);
@ -368,7 +369,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
setDefaultAPI(); setDefaultAPI();
final Configuration conf = getConfiguration(); final Configuration conf = getConfiguration();
mTask = new SignInTask(this, conf, mUsername, mPassword, mAuthType, mUserColor, mAPIUrlFormat, mTask = new SignInTask(this, conf, mUsername, mPassword, mAuthType, mUserColor, mAPIUrlFormat,
mSameOAuthSigningUrl); mSameOAuthSigningUrl, mNoVersionSuffix);
mTask.execute(); mTask.execute();
} }
@ -384,7 +385,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
final String secret = intent.getStringExtra(EXTRA_REQUEST_TOKEN_SECRET); final String secret = intent.getStringExtra(EXTRA_REQUEST_TOKEN_SECRET);
final String verifier = intent.getStringExtra(EXTRA_OAUTH_VERIFIER); final String verifier = intent.getStringExtra(EXTRA_OAUTH_VERIFIER);
mTask = new BrowserSignInTask(this, conf, token, secret, verifier, mUserColor, mAPIUrlFormat, mTask = new BrowserSignInTask(this, conf, token, secret, verifier, mUserColor, mAPIUrlFormat,
mSameOAuthSigningUrl); mSameOAuthSigningUrl, mNoVersionSuffix);
mTask.execute(); mTask.execute();
} }
@ -397,9 +398,10 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
cb.setHttpClientFactory(new TwidereHttpClientFactory(mApplication)); cb.setHttpClientFactory(new TwidereHttpClientFactory(mApplication));
setUserAgent(this, cb); setUserAgent(this, cb);
if (!isEmpty(mAPIUrlFormat)) { if (!isEmpty(mAPIUrlFormat)) {
cb.setRestBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", "/1.1/")); final String versionSuffix = mNoVersionSuffix ? null : "/1.1/";
cb.setRestBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", versionSuffix));
cb.setOAuthBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", "/oauth/")); cb.setOAuthBaseURL(Utils.getApiUrl(mAPIUrlFormat, "api", "/oauth/"));
cb.setUploadBaseURL(Utils.getApiUrl(mAPIUrlFormat, "upload", "/1.1/")); cb.setUploadBaseURL(Utils.getApiUrl(mAPIUrlFormat, "upload", versionSuffix));
if (!mSameOAuthSigningUrl) { if (!mSameOAuthSigningUrl) {
cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_BASE_URL); cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_BASE_URL);
cb.setSigningOAuthBaseURL(DEFAULT_SIGNING_OAUTH_BASE_URL); cb.setSigningOAuthBaseURL(DEFAULT_SIGNING_OAUTH_BASE_URL);
@ -437,6 +439,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
final String apiUrlFormat = getNonEmptyString(mPreferences, KEY_API_URL_FORMAT, null); final String apiUrlFormat = getNonEmptyString(mPreferences, KEY_API_URL_FORMAT, null);
final int authType = mPreferences.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH); final int authType = mPreferences.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH);
final boolean sameOAuthSigningUrl = mPreferences.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false); final boolean sameOAuthSigningUrl = mPreferences.getBoolean(KEY_SAME_OAUTH_SIGNING_URL, false);
final boolean noVersionSuffix = mPreferences.getBoolean(KEY_NO_VERSION_SUFFIX, false);
final String consumerKey = getNonEmptyString(mPreferences, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2); final String consumerKey = getNonEmptyString(mPreferences, KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY_2);
final String consumerSecret = getNonEmptyString(mPreferences, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2); final String consumerSecret = getNonEmptyString(mPreferences, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2);
if (isEmpty(mAPIUrlFormat) || defaultApiChanged) { if (isEmpty(mAPIUrlFormat) || defaultApiChanged) {
@ -448,6 +451,9 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
if (defaultApiChanged) { if (defaultApiChanged) {
mSameOAuthSigningUrl = sameOAuthSigningUrl; mSameOAuthSigningUrl = sameOAuthSigningUrl;
} }
if (defaultApiChanged) {
mNoVersionSuffix = noVersionSuffix;
}
if (isEmpty(mConsumerKey) || defaultApiChanged) { if (isEmpty(mConsumerKey) || defaultApiChanged) {
mConsumerKey = consumerKey; mConsumerKey = consumerKey;
} }
@ -472,25 +478,27 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
} }
} }
void onSignInResult(final SignInActivity.SigninResponse result) { void onSignInResult(final SignInResponse result) {
if (result != null) { if (result != null) {
if (result.succeed) { if (result.succeed) {
final ContentValues values; final ContentValues values;
switch (result.auth_type) { switch (result.auth_type) {
case Accounts.AUTH_TYPE_BASIC: { case Accounts.AUTH_TYPE_BASIC: {
values = makeAccountContentValuesBasic(result.conf, result.basic_username, values = makeAccountContentValuesBasic(result.conf, result.basic_username,
result.basic_password, result.user, result.color, result.api_url_format); result.basic_password, result.user, result.color,
result.api_url_format, result.no_version_suffix);
break; break;
} }
case Accounts.AUTH_TYPE_TWIP_O_MODE: { case Accounts.AUTH_TYPE_TWIP_O_MODE: {
values = makeAccountContentValuesTWIP(result.conf, result.user, result.color, values = makeAccountContentValuesTWIP(result.conf, result.user, result.color,
result.api_url_format); result.api_url_format, result.no_version_suffix);
break; break;
} }
case Accounts.AUTH_TYPE_OAUTH: case Accounts.AUTH_TYPE_OAUTH:
case Accounts.AUTH_TYPE_XAUTH: { case Accounts.AUTH_TYPE_XAUTH: {
values = makeAccountContentValuesOAuth(result.conf, result.access_token, result.user, values = makeAccountContentValuesOAuth(result.conf, result.access_token,
result.auth_type, result.color, result.api_url_format, result.same_oauth_signing_url); result.user, result.auth_type, result.color, result.api_url_format,
result.same_oauth_signing_url, result.no_version_suffix);
break; break;
} }
default: { default: {
@ -540,7 +548,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
mSetColorButton.setEnabled(false); mSetColorButton.setEnabled(false);
} }
public static abstract class AbstractSignInTask extends AsyncTask<Void, Void, SigninResponse> { public static abstract class AbstractSignInTask extends AsyncTask<Void, Void, SignInResponse> {
protected final Configuration conf; protected final Configuration conf;
protected final SignInActivity callback; protected final SignInActivity callback;
@ -551,7 +559,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
} }
@Override @Override
protected void onPostExecute(final SigninResponse result) { protected void onPostExecute(final SignInResponse result) {
if (callback != null) { if (callback != null) {
callback.onSignInResult(result); callback.onSignInResult(result);
} }
@ -597,11 +605,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
private final Context context; private final Context context;
private final String api_url_format; private final String api_url_format;
private final boolean same_oauth_signing_url; private final boolean same_oauth_signing_url, no_version_suffix;
public BrowserSignInTask(final SignInActivity context, final Configuration conf, final String request_token, public BrowserSignInTask(final SignInActivity context, final Configuration conf, final String request_token,
final String request_token_secret, final String oauth_verifier, final Integer user_color, final String request_token_secret, final String oauth_verifier, final Integer user_color,
final String api_url_format, final boolean same_oauth_signing_url) { final String api_url_format, final boolean same_oauth_signing_url, final boolean no_version_suffix) {
super(context, conf); super(context, conf);
this.context = context; this.context = context;
this.conf = conf; this.conf = conf;
@ -611,23 +619,24 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
this.user_color = user_color; this.user_color = user_color;
this.api_url_format = api_url_format; this.api_url_format = api_url_format;
this.same_oauth_signing_url = same_oauth_signing_url; this.same_oauth_signing_url = same_oauth_signing_url;
this.no_version_suffix = no_version_suffix;
} }
@Override @Override
protected SigninResponse doInBackground(final Void... params) { protected SignInResponse doInBackground(final Void... params) {
try { try {
final Twitter twitter = new TwitterFactory(conf).getInstance(); final Twitter twitter = new TwitterFactory(conf).getInstance();
final AccessToken access_token = twitter.getOAuthAccessToken(new RequestToken(conf, request_token, final AccessToken access_token = twitter.getOAuthAccessToken(new RequestToken(conf, request_token,
request_token_secret), oauth_verifier); request_token_secret), oauth_verifier);
final long userId = access_token.getUserId(); final long userId = access_token.getUserId();
if (userId <= 0) return new SigninResponse(false, false, null); if (userId <= 0) return new SignInResponse(false, false, null);
final User user = twitter.verifyCredentials(); final User user = twitter.verifyCredentials();
if (isUserLoggedIn(context, userId)) return new SigninResponse(true, false, null); if (isUserLoggedIn(context, userId)) return new SignInResponse(true, false, null);
final int color = user_color != null ? user_color : analyseUserProfileColor(user); final int color = user_color != null ? user_color : analyseUserProfileColor(user);
return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, api_url_format, return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color,
same_oauth_signing_url); api_url_format, same_oauth_signing_url, no_version_suffix);
} catch (final TwitterException e) { } catch (final TwitterException e) {
return new SigninResponse(false, false, e); return new SignInResponse(false, false, e);
} }
} }
} }
@ -655,11 +664,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
private final Context context; private final Context context;
private final String api_url_format; private final String api_url_format;
private final boolean same_oauth_signing_url; private final boolean same_oauth_signing_url, no_version_suffix;
public SignInTask(final SignInActivity context, final Configuration conf, final String username, public SignInTask(final SignInActivity context, final Configuration conf, final String username,
final String password, final int auth_type, final Integer user_color, final String api_url_format, final String password, final int auth_type, final Integer user_color, final String api_url_format,
final boolean same_oauth_signing_url) { final boolean same_oauth_signing_url, final boolean no_version_suffix) {
super(context, conf); super(context, conf);
this.context = context; this.context = context;
this.conf = conf; this.conf = conf;
@ -669,10 +678,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
this.user_color = user_color; this.user_color = user_color;
this.api_url_format = api_url_format; this.api_url_format = api_url_format;
this.same_oauth_signing_url = same_oauth_signing_url; this.same_oauth_signing_url = same_oauth_signing_url;
this.no_version_suffix = no_version_suffix;
} }
@Override @Override
protected SigninResponse doInBackground(final Void... params) { protected SignInResponse doInBackground(final Void... params) {
try { try {
switch (auth_type) { switch (auth_type) {
case Accounts.AUTH_TYPE_OAUTH: case Accounts.AUTH_TYPE_OAUTH:
@ -687,67 +697,73 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
return authOAuth(); return authOAuth();
} catch (final TwitterException e) { } catch (final TwitterException e) {
e.printStackTrace(); e.printStackTrace();
return new SigninResponse(false, false, e); return new SignInResponse(false, false, e);
} catch (final AuthenticationException e) { } catch (final AuthenticationException e) {
e.printStackTrace(); e.printStackTrace();
return new SigninResponse(false, false, e); return new SignInResponse(false, false, e);
} }
} }
private SigninResponse authBasic() throws TwitterException { private SignInResponse authBasic() throws TwitterException {
final Twitter twitter = new TwitterFactory(conf).getInstance(new BasicAuthorization(username, password)); final Twitter twitter = new TwitterFactory(conf).getInstance(new BasicAuthorization(username, password));
final User user = twitter.verifyCredentials(); final User user = twitter.verifyCredentials();
final long user_id = user.getId(); final long user_id = user.getId();
if (user_id <= 0) return new SigninResponse(false, false, null); if (user_id <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
final int color = user_color != null ? user_color : analyseUserProfileColor(user); final int color = user_color != null ? user_color : analyseUserProfileColor(user);
return new SigninResponse(conf, username, password, user, color, api_url_format); return new SignInResponse(conf, username, password, user, color, api_url_format,
no_version_suffix);
} }
private SigninResponse authOAuth() throws AuthenticationException, TwitterException { private SignInResponse authOAuth() throws AuthenticationException, TwitterException {
final Twitter twitter = new TwitterFactory(conf).getInstance(); final Twitter twitter = new TwitterFactory(conf).getInstance();
final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(twitter); final OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(twitter);
final AccessToken access_token = authenticator.getOAuthAccessToken(username, password); final AccessToken access_token = authenticator.getOAuthAccessToken(username, password);
final long user_id = access_token.getUserId(); final long user_id = access_token.getUserId();
if (user_id <= 0) return new SigninResponse(false, false, null); if (user_id <= 0) return new SignInResponse(false, false, null);
final User user = twitter.verifyCredentials(); final User user = twitter.verifyCredentials();
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
final int color = user_color != null ? user_color : analyseUserProfileColor(user); final int color = user_color != null ? user_color : analyseUserProfileColor(user);
return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, api_url_format, return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color,
same_oauth_signing_url); api_url_format, same_oauth_signing_url, no_version_suffix);
} }
private SigninResponse authTwipOMode() throws TwitterException { private SignInResponse authTwipOMode() throws TwitterException {
final Twitter twitter = new TwitterFactory(conf).getInstance(new TwipOModeAuthorization()); final Twitter twitter = new TwitterFactory(conf).getInstance(new TwipOModeAuthorization());
final User user = twitter.verifyCredentials(); final User user = twitter.verifyCredentials();
final long user_id = user.getId(); final long user_id = user.getId();
if (user_id <= 0) return new SigninResponse(false, false, null); if (user_id <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
final int color = user_color != null ? user_color : analyseUserProfileColor(user); final int color = user_color != null ? user_color : analyseUserProfileColor(user);
return new SigninResponse(conf, user, color, api_url_format); return new SignInResponse(conf, user, color, api_url_format, no_version_suffix);
} }
private SigninResponse authxAuth() throws TwitterException { private SignInResponse authxAuth() throws TwitterException {
final Twitter twitter = new TwitterFactory(conf).getInstance(); final Twitter twitter = new TwitterFactory(conf).getInstance();
final AccessToken access_token = twitter.getOAuthAccessToken(username, password); final AccessToken access_token = twitter.getOAuthAccessToken(username, password);
final User user = twitter.verifyCredentials(); final User user = twitter.verifyCredentials();
final long user_id = user.getId(); final long user_id = user.getId();
if (user_id <= 0) return new SigninResponse(false, false, null); if (user_id <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null); if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
final int color = user_color != null ? user_color : analyseUserProfileColor(user); final int color = user_color != null ? user_color : analyseUserProfileColor(user);
return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_XAUTH, color, api_url_format, return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_XAUTH, color,
same_oauth_signing_url); api_url_format, same_oauth_signing_url, no_version_suffix);
} }
} }
@Override
public int getThemeResourceId() {
return ThemeUtils.getSettingsThemeResource(this);
}
static interface SigninCallback { static interface SigninCallback {
void onSigninResult(SigninResponse response); void onSigninResult(SignInResponse response);
void onSigninStart(); void onSigninStart();
} }
static class SigninResponse { static class SignInResponse {
public final boolean already_logged_in, succeed; public final boolean already_logged_in, succeed;
public final Exception exception; public final Exception exception;
@ -757,16 +773,16 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
public final User user; public final User user;
public final int auth_type, color; public final int auth_type, color;
public final String api_url_format; public final String api_url_format;
public final boolean same_oauth_signing_url; public final boolean same_oauth_signing_url, no_version_suffix;
public SigninResponse(final boolean already_logged_in, final boolean succeed, final Exception exception) { public SignInResponse(final boolean already_logged_in, final boolean succeed, final Exception exception) {
this(already_logged_in, succeed, exception, null, null, null, null, null, 0, 0, null, false); this(already_logged_in, succeed, exception, null, null, null, null, null, 0, 0, null, false, false);
} }
public SigninResponse(final boolean already_logged_in, final boolean succeed, final Exception exception, public SignInResponse(final boolean already_logged_in, final boolean succeed, final Exception exception,
final Configuration conf, final String basic_username, final String basic_password, final Configuration conf, final String basic_username, final String basic_password,
final AccessToken access_token, final User user, final int auth_type, final int color, final AccessToken access_token, final User user, final int auth_type, final int color,
final String api_url_format, final boolean same_oauth_signing_url) { final String api_url_format, final boolean same_oauth_signing_url, final boolean no_version_suffix) {
this.already_logged_in = already_logged_in; this.already_logged_in = already_logged_in;
this.succeed = succeed; this.succeed = succeed;
this.exception = exception; this.exception = exception;
@ -779,23 +795,27 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
this.color = color; this.color = color;
this.api_url_format = api_url_format; this.api_url_format = api_url_format;
this.same_oauth_signing_url = same_oauth_signing_url; this.same_oauth_signing_url = same_oauth_signing_url;
this.no_version_suffix = no_version_suffix;
} }
public SigninResponse(final Configuration conf, final AccessToken access_token, final User user, public SignInResponse(final Configuration conf, final AccessToken access_token, final User user,
final int auth_type, final int color, final String api_url_format, final boolean same_oauth_signing_url) { final int auth_type, final int color, final String api_url_format,
final boolean same_oauth_signing_url, final boolean no_version_suffix) {
this(false, true, null, conf, null, null, access_token, user, auth_type, color, api_url_format, this(false, true, null, conf, null, null, access_token, user, auth_type, color, api_url_format,
same_oauth_signing_url); same_oauth_signing_url, no_version_suffix);
} }
public SigninResponse(final Configuration conf, final String basic_username, final String basic_password, public SignInResponse(final Configuration conf, final String basic_username, final String basic_password,
final User user, final int color, final String api_url_format) { final User user, final int color, final String api_url_format,
final boolean no_version_suffix) {
this(false, true, null, conf, basic_username, basic_password, null, user, Accounts.AUTH_TYPE_BASIC, color, this(false, true, null, conf, basic_username, basic_password, null, user, Accounts.AUTH_TYPE_BASIC, color,
api_url_format, false); api_url_format, false, no_version_suffix);
} }
public SigninResponse(final Configuration conf, final User user, final int color, final String api_url_format) { public SignInResponse(final Configuration conf, final User user, final int color,
final String api_url_format, final boolean no_version_suffix) {
this(false, true, null, conf, null, null, null, user, Accounts.AUTH_TYPE_TWIP_O_MODE, color, this(false, true, null, conf, null, null, null, user, Accounts.AUTH_TYPE_TWIP_O_MODE, color,
api_url_format, false); api_url_format, false, no_version_suffix);
} }
} }
} }

View File

@ -248,6 +248,8 @@ public interface SharedPreferenceConstants {
public static final String KEY_API_URL_FORMAT = "api_url_format"; public static final String KEY_API_URL_FORMAT = "api_url_format";
@Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false) @Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false)
public static final String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url"; public static final String KEY_SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url";
@Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false)
public static final String KEY_NO_VERSION_SUFFIX = "no_version_suffix";
@Preference(type = INT, hasDefault = true, defaultInt = Accounts.AUTH_TYPE_OAUTH) @Preference(type = INT, hasDefault = true, defaultInt = Accounts.AUTH_TYPE_OAUTH)
public static final String KEY_AUTH_TYPE = "auth_type"; public static final String KEY_AUTH_TYPE = "auth_type";
@Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY_2) @Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY_2)

View File

@ -19,7 +19,7 @@
package org.mariotaku.twidere.fragment.support; package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues; import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilteredUserContentValues;
import static org.mariotaku.twidere.util.Utils.getDisplayName; import static org.mariotaku.twidere.util.Utils.getDisplayName;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert;
@ -41,6 +41,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.model.ParcelableStatus; import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUserMention; import org.mariotaku.twidere.model.ParcelableUserMention;
import org.mariotaku.twidere.provider.TweetStore.Filters; import org.mariotaku.twidere.provider.TweetStore.Filters;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.HtmlEscapeHelper; import org.mariotaku.twidere.util.HtmlEscapeHelper;
import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
@ -71,11 +72,11 @@ public class AddStatusFilterDialogFragment extends BaseSupportDialogFragment imp
if (value instanceof ParcelableUserMention) { if (value instanceof ParcelableUserMention) {
final ParcelableUserMention mention = (ParcelableUserMention) value; final ParcelableUserMention mention = (ParcelableUserMention) value;
user_ids.add(mention.id); user_ids.add(mention.id);
user_values.add(makeFilterdUserContentValues(mention)); user_values.add(makeFilteredUserContentValues(mention));
} else if (value instanceof ParcelableStatus) { } else if (value instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) value; final ParcelableStatus status = (ParcelableStatus) value;
user_ids.add(status.user_id); user_ids.add(status.user_id);
user_values.add(makeFilterdUserContentValues(status)); user_values.add(ContentValuesCreator.makeFilteredUserContentValues(status));
} else if (info.type == FilterItemInfo.FILTER_TYPE_KEYWORD) { } else if (info.type == FilterItemInfo.FILTER_TYPE_KEYWORD) {
if (value != null) { if (value != null) {
final String keyword = ParseUtils.parseString(value); final String keyword = ParseUtils.parseString(value);

View File

@ -65,7 +65,6 @@ import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.refreshnow.widget.RefreshMode; import org.mariotaku.refreshnow.widget.RefreshMode;
import org.mariotaku.twidere.R; import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity; import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
@ -98,6 +97,7 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ColorLabelRelativeLayout; import org.mariotaku.twidere.view.ColorLabelRelativeLayout;
import org.mariotaku.twidere.view.ExtendedFrameLayout; import org.mariotaku.twidere.view.ExtendedFrameLayout;
import org.mariotaku.twidere.view.StatusTextView; import org.mariotaku.twidere.view.StatusTextView;
import org.mariotaku.twidere.view.TwidereMenuBar;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@ -156,7 +156,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
private boolean mFollowInfoDisplayed, mLocationInfoDisplayed; private boolean mFollowInfoDisplayed, mLocationInfoDisplayed;
private boolean mStatusLoaderInitialized, mLocationLoaderInitialized; private boolean mStatusLoaderInitialized, mLocationLoaderInitialized;
private boolean mFollowInfoLoaderInitialized; private boolean mFollowInfoLoaderInitialized;
;
private boolean mShouldScroll; private boolean mShouldScroll;
private SharedPreferences mPreferences; private SharedPreferences mPreferences;
private AsyncTwitterWrapper mTwitterWrapper; private AsyncTwitterWrapper mTwitterWrapper;
@ -171,7 +171,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
private Button mRetryButton; private Button mRetryButton;
private View mMainContent, mFollowIndicator, mImagePreviewContainer, mLocationContainer, mLocationBackgroundView; private View mMainContent, mFollowIndicator, mImagePreviewContainer, mLocationContainer, mLocationBackgroundView;
private ColorLabelRelativeLayout mProfileView; private ColorLabelRelativeLayout mProfileView;
private MenuBar mMenuBar; private TwidereMenuBar mMenuBar;
private ProgressBar mDetailsLoadProgress, mFollowInfoProgress; private ProgressBar mDetailsLoadProgress, mFollowInfoProgress;
private LinearLayout mImagePreviewGrid; private LinearLayout mImagePreviewGrid;
private View mHeaderView; private View mHeaderView;
@ -577,7 +577,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
final View view = inflater.inflate(R.layout.fragment_details_page, null, false); final View view = inflater.inflate(R.layout.fragment_details_page, null, false);
mMainContent = view.findViewById(R.id.content); mMainContent = view.findViewById(R.id.content);
mDetailsLoadProgress = (ProgressBar) view.findViewById(R.id.details_load_progress); mDetailsLoadProgress = (ProgressBar) view.findViewById(R.id.details_load_progress);
mMenuBar = (MenuBar) view.findViewById(R.id.menu_bar); mMenuBar = (TwidereMenuBar) view.findViewById(R.id.menu_bar);
mDetailsContainer = (ExtendedFrameLayout) view.findViewById(R.id.details_container); mDetailsContainer = (ExtendedFrameLayout) view.findViewById(R.id.details_container);
mDetailsContainer.addView(super.onCreateView(inflater, container, savedInstanceState)); mDetailsContainer.addView(super.onCreateView(inflater, container, savedInstanceState));
mHeaderView = inflater.inflate(R.layout.header_status, null, false); mHeaderView = inflater.inflate(R.layout.header_status, null, false);

View File

@ -83,6 +83,7 @@ import org.mariotaku.twidere.provider.TweetStore.Accounts;
import org.mariotaku.twidere.provider.TweetStore.CachedUsers; import org.mariotaku.twidere.provider.TweetStore.CachedUsers;
import org.mariotaku.twidere.provider.TweetStore.Filters; import org.mariotaku.twidere.provider.TweetStore.Filters;
import org.mariotaku.twidere.util.AsyncTwitterWrapper; import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.FlymeUtils; import org.mariotaku.twidere.util.FlymeUtils;
import org.mariotaku.twidere.util.ImageLoaderWrapper; import org.mariotaku.twidere.util.ImageLoaderWrapper;
import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ParseUtils;
@ -92,6 +93,7 @@ import org.mariotaku.twidere.util.TwidereLinkify.OnLinkClickListener;
import org.mariotaku.twidere.view.ColorLabelLinearLayout; import org.mariotaku.twidere.view.ColorLabelLinearLayout;
import org.mariotaku.twidere.view.ExtendedFrameLayout; import org.mariotaku.twidere.view.ExtendedFrameLayout;
import org.mariotaku.twidere.view.ProfileImageView; import org.mariotaku.twidere.view.ProfileImageView;
import org.mariotaku.twidere.view.TwidereMenuBar;
import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener; import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener;
import java.util.Locale; import java.util.Locale;
@ -101,7 +103,6 @@ import twitter4j.Twitter;
import twitter4j.TwitterException; import twitter4j.TwitterException;
import static android.text.TextUtils.isEmpty; import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues;
import static org.mariotaku.twidere.util.ParseUtils.parseLong; import static org.mariotaku.twidere.util.ParseUtils.parseLong;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserColor; import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserColor;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserNickname; import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserNickname;
@ -161,7 +162,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl
private View mMainContent; private View mMainContent;
private View mProfileBannerSpace; private View mProfileBannerSpace;
private ProgressBar mDetailsLoadProgress; private ProgressBar mDetailsLoadProgress;
private MenuBar mMenuBar; private TwidereMenuBar mMenuBar;
private ListActionAdapter mAdapter; private ListActionAdapter mAdapter;
@ -720,7 +721,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
mMainContent = view.findViewById(R.id.content); mMainContent = view.findViewById(R.id.content);
mDetailsLoadProgress = (ProgressBar) view.findViewById(R.id.details_load_progress); mDetailsLoadProgress = (ProgressBar) view.findViewById(R.id.details_load_progress);
mMenuBar = (MenuBar) view.findViewById(R.id.menu_bar); mMenuBar = (TwidereMenuBar) view.findViewById(R.id.menu_bar);
mErrorRetryContainer = view.findViewById(R.id.error_retry_container); mErrorRetryContainer = view.findViewById(R.id.error_retry_container);
mRetryButton = (Button) view.findViewById(R.id.retry); mRetryButton = (Button) view.findViewById(R.id.retry);
mErrorMessageView = (TextView) view.findViewById(R.id.error_message); mErrorMessageView = (TextView) view.findViewById(R.id.error_message);
@ -792,7 +793,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl
case MENU_ADD_TO_FILTER: { case MENU_ADD_TO_FILTER: {
final ContentResolver resolver = getContentResolver(); final ContentResolver resolver = getContentResolver();
resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null); resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null);
resolver.insert(Filters.Users.CONTENT_URI, makeFilterdUserContentValues(user)); resolver.insert(Filters.Users.CONTENT_URI, ContentValuesCreator.makeFilteredUserContentValues(user));
showInfoMessage(getActivity(), R.string.message_user_muted, false); showInfoMessage(getActivity(), R.string.message_user_muted, false);
break; break;
} }

View File

@ -19,9 +19,6 @@
package org.mariotaku.twidere.model; package org.mariotaku.twidere.model;
import static org.mariotaku.twidere.util.Utils.isOfficialConsumerKeySecret;
import static org.mariotaku.twidere.util.Utils.shouldForceUsingPrivateAPIs;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Color; import android.graphics.Color;
@ -38,263 +35,268 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import static org.mariotaku.twidere.util.Utils.isOfficialConsumerKeySecret;
import static org.mariotaku.twidere.util.Utils.shouldForceUsingPrivateAPIs;
public class Account implements Parcelable { public class Account implements Parcelable {
public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() { public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() {
@Override @Override
public Account createFromParcel(final Parcel in) { public Account createFromParcel(final Parcel in) {
return new Account(in); return new Account(in);
} }
@Override @Override
public Account[] newArray(final int size) { public Account[] newArray(final int size) {
return new Account[size]; return new Account[size];
} }
}; };
public final String screen_name, name, profile_image_url, profile_banner_url; public final String screen_name, name, profile_image_url, profile_banner_url;
public final long account_id; public final long account_id;
public final int color; public final int color;
public final boolean is_activated; public final boolean is_activated;
public final boolean is_dummy; public final boolean is_dummy;
public Account(final Cursor cursor, final Indices indices) { public Account(final Cursor cursor, final Indices indices) {
is_dummy = false; is_dummy = false;
screen_name = indices.screen_name != -1 ? cursor.getString(indices.screen_name) : null; screen_name = indices.screen_name != -1 ? cursor.getString(indices.screen_name) : null;
name = indices.name != -1 ? cursor.getString(indices.name) : null; name = indices.name != -1 ? cursor.getString(indices.name) : null;
account_id = indices.account_id != -1 ? cursor.getLong(indices.account_id) : -1; account_id = indices.account_id != -1 ? cursor.getLong(indices.account_id) : -1;
profile_image_url = indices.profile_image_url != -1 ? cursor.getString(indices.profile_image_url) : null; profile_image_url = indices.profile_image_url != -1 ? cursor.getString(indices.profile_image_url) : null;
profile_banner_url = indices.profile_banner_url != -1 ? cursor.getString(indices.profile_banner_url) : null; profile_banner_url = indices.profile_banner_url != -1 ? cursor.getString(indices.profile_banner_url) : null;
color = indices.color != -1 ? cursor.getInt(indices.color) : Color.TRANSPARENT; color = indices.color != -1 ? cursor.getInt(indices.color) : Color.TRANSPARENT;
is_activated = indices.is_activated != -1 ? cursor.getInt(indices.is_activated) == 1 : false; is_activated = indices.is_activated != -1 ? cursor.getInt(indices.is_activated) == 1 : false;
} }
public Account(final Parcel source) { public Account(final Parcel source) {
is_dummy = source.readInt() == 1; is_dummy = source.readInt() == 1;
is_activated = source.readInt() == 1; is_activated = source.readInt() == 1;
account_id = source.readLong(); account_id = source.readLong();
name = source.readString(); name = source.readString();
screen_name = source.readString(); screen_name = source.readString();
profile_image_url = source.readString(); profile_image_url = source.readString();
profile_banner_url = source.readString(); profile_banner_url = source.readString();
color = source.readInt(); color = source.readInt();
} }
private Account() { private Account() {
is_dummy = true; is_dummy = true;
screen_name = null; screen_name = null;
name = null; name = null;
account_id = -1; account_id = -1;
profile_image_url = null; profile_image_url = null;
profile_banner_url = null; profile_banner_url = null;
color = 0; color = 0;
is_activated = false; is_activated = false;
} }
@Override @Override
public int describeContents() { public int describeContents() {
return 0; return 0;
} }
@Override @Override
public String toString() { public String toString() {
return "Account{screen_name=" + screen_name + ", name=" + name + ", profile_image_url=" + profile_image_url return "Account{screen_name=" + screen_name + ", name=" + name + ", profile_image_url=" + profile_image_url
+ ", profile_banner_url=" + profile_banner_url + ", account_id=" + account_id + ", color=" + color + ", profile_banner_url=" + profile_banner_url + ", account_id=" + account_id + ", color=" + color
+ ", is_activated=" + is_activated + ", is_dummy=" + is_dummy + "}"; + ", is_activated=" + is_activated + ", is_dummy=" + is_dummy + "}";
} }
@Override @Override
public void writeToParcel(final Parcel out, final int flags) { public void writeToParcel(final Parcel out, final int flags) {
out.writeInt(is_dummy ? 1 : 0); out.writeInt(is_dummy ? 1 : 0);
out.writeInt(is_activated ? 1 : 0); out.writeInt(is_activated ? 1 : 0);
out.writeLong(account_id); out.writeLong(account_id);
out.writeString(name); out.writeString(name);
out.writeString(screen_name); out.writeString(screen_name);
out.writeString(profile_image_url); out.writeString(profile_image_url);
out.writeString(profile_banner_url); out.writeString(profile_banner_url);
out.writeInt(color); out.writeInt(color);
} }
public static Account dummyInstance() { public static Account dummyInstance() {
return new Account(); return new Account();
} }
public static Account getAccount(final Context context, final long account_id) { public static Account getAccount(final Context context, final long account_id) {
if (context == null) return null; if (context == null) return null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null); Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null);
if (cur != null) { if (cur != null) {
try { try {
if (cur.getCount() > 0 && cur.moveToFirst()) { if (cur.getCount() > 0 && cur.moveToFirst()) {
final Indices indices = new Indices(cur); final Indices indices = new Indices(cur);
cur.moveToFirst(); cur.moveToFirst();
return new Account(cur, indices); return new Account(cur, indices);
} }
} finally { } finally {
cur.close(); cur.close();
} }
} }
return null; return null;
} }
public static long[] getAccountIds(final Account[] accounts) { public static long[] getAccountIds(final Account[] accounts) {
final long[] ids = new long[accounts.length]; final long[] ids = new long[accounts.length];
for (int i = 0, j = accounts.length; i < j; i++) { for (int i = 0, j = accounts.length; i < j; i++) {
ids[i] = accounts[i].account_id; ids[i] = accounts[i].account_id;
} }
return ids; return ids;
} }
public static Account[] getAccounts(final Context context, final boolean activatedOnly, public static Account[] getAccounts(final Context context, final boolean activatedOnly,
final boolean officialKeyOnly) { final boolean officialKeyOnly) {
final List<Account> list = getAccountsList(context, activatedOnly, officialKeyOnly); final List<Account> list = getAccountsList(context, activatedOnly, officialKeyOnly);
return list.toArray(new Account[list.size()]); return list.toArray(new Account[list.size()]);
} }
public static Account[] getAccounts(final Context context, final long[] accountIds) { public static Account[] getAccounts(final Context context, final long[] accountIds) {
if (context == null) return new Account[0]; if (context == null) return new Account[0];
final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID), final String where = accountIds != null ? Where.in(new Column(Accounts.ACCOUNT_ID),
new RawItemArray(accountIds)).getSQL() : null; new RawItemArray(accountIds)).getSQL() : null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS_NO_CREDENTIALS, where, null, null); Accounts.COLUMNS_NO_CREDENTIALS, where, null, null);
if (cur == null) return new Account[0]; if (cur == null) return new Account[0];
try { try {
final Indices idx = new Indices(cur); final Indices idx = new Indices(cur);
cur.moveToFirst(); cur.moveToFirst();
final Account[] names = new Account[cur.getCount()]; final Account[] names = new Account[cur.getCount()];
while (!cur.isAfterLast()) { while (!cur.isAfterLast()) {
names[cur.getPosition()] = new Account(cur, idx); names[cur.getPosition()] = new Account(cur, idx);
cur.moveToNext(); cur.moveToNext();
} }
return names; return names;
} finally { } finally {
cur.close(); cur.close();
} }
} }
public static List<Account> getAccountsList(final Context context, final boolean activatedOnly) { public static List<Account> getAccountsList(final Context context, final boolean activatedOnly) {
return getAccountsList(context, activatedOnly, false); return getAccountsList(context, activatedOnly, false);
} }
public static List<Account> getAccountsList(final Context context, final boolean activatedOnly, public static List<Account> getAccountsList(final Context context, final boolean activatedOnly,
final boolean officialKeyOnly) { final boolean officialKeyOnly) {
if (context == null) return Collections.emptyList(); if (context == null) return Collections.emptyList();
final ArrayList<Account> accounts = new ArrayList<Account>(); final ArrayList<Account> accounts = new ArrayList<Account>();
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS_NO_CREDENTIALS, activatedOnly ? Accounts.IS_ACTIVATED + " = 1" : null, null, null); Accounts.COLUMNS_NO_CREDENTIALS, activatedOnly ? Accounts.IS_ACTIVATED + " = 1" : null, null, null);
if (cur != null) { if (cur != null) {
final Indices indices = new Indices(cur); final Indices indices = new Indices(cur);
cur.moveToFirst(); cur.moveToFirst();
while (!cur.isAfterLast()) { while (!cur.isAfterLast()) {
if (!officialKeyOnly) { if (!officialKeyOnly) {
accounts.add(new Account(cur, indices)); accounts.add(new Account(cur, indices));
} else { } else {
final String consumerKey = cur.getString(indices.consumer_key); final String consumerKey = cur.getString(indices.consumer_key);
final String consumerSecret = cur.getString(indices.consumer_secret); final String consumerSecret = cur.getString(indices.consumer_secret);
if (shouldForceUsingPrivateAPIs(context) if (shouldForceUsingPrivateAPIs(context)
|| isOfficialConsumerKeySecret(context, consumerKey, consumerSecret)) { || isOfficialConsumerKeySecret(context, consumerKey, consumerSecret)) {
accounts.add(new Account(cur, indices)); accounts.add(new Account(cur, indices));
} }
} }
cur.moveToNext(); cur.moveToNext();
} }
cur.close(); cur.close();
} }
return accounts; return accounts;
} }
public static AccountWithCredentials getAccountWithCredentials(final Context context, final long account_id) { public static AccountWithCredentials getAccountWithCredentials(final Context context, final long account_id) {
if (context == null) return null; if (context == null) return null;
final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, final Cursor cur = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null); Accounts.COLUMNS, Accounts.ACCOUNT_ID + " = " + account_id, null, null);
if (cur != null) { if (cur != null) {
try { try {
if (cur.getCount() > 0 && cur.moveToFirst()) { if (cur.getCount() > 0 && cur.moveToFirst()) {
final Indices indices = new Indices(cur); final Indices indices = new Indices(cur);
cur.moveToFirst(); cur.moveToFirst();
return new AccountWithCredentials(cur, indices); return new AccountWithCredentials(cur, indices);
} }
} finally { } finally {
cur.close(); cur.close();
} }
} }
return null; return null;
} }
public static class AccountWithCredentials extends Account { public static class AccountWithCredentials extends Account {
public final int auth_type; public final int auth_type;
public final String consumer_key, consumer_secret; public final String consumer_key, consumer_secret;
public final String basic_auth_username, basic_auth_password; public final String basic_auth_username, basic_auth_password;
public final String oauth_token, oauth_token_secret; public final String oauth_token, oauth_token_secret;
public final String api_url_format; public final String api_url_format;
public final boolean same_oauth_signing_url; public final boolean same_oauth_signing_url, no_version_suffix;
public AccountWithCredentials(final Cursor cursor, final Indices indices) { public AccountWithCredentials(final Cursor cursor, final Indices indices) {
super(cursor, indices); super(cursor, indices);
auth_type = cursor.getInt(indices.auth_type); auth_type = cursor.getInt(indices.auth_type);
consumer_key = cursor.getString(indices.consumer_key); consumer_key = cursor.getString(indices.consumer_key);
consumer_secret = cursor.getString(indices.consumer_secret); consumer_secret = cursor.getString(indices.consumer_secret);
basic_auth_username = cursor.getString(indices.basic_auth_username); basic_auth_username = cursor.getString(indices.basic_auth_username);
basic_auth_password = cursor.getString(indices.basic_auth_password); basic_auth_password = cursor.getString(indices.basic_auth_password);
oauth_token = cursor.getString(indices.oauth_token); oauth_token = cursor.getString(indices.oauth_token);
oauth_token_secret = cursor.getString(indices.oauth_token_secret); oauth_token_secret = cursor.getString(indices.oauth_token_secret);
api_url_format = cursor.getString(indices.api_url_format); api_url_format = cursor.getString(indices.api_url_format);
same_oauth_signing_url = cursor.getInt(indices.same_oauth_signing_url) == 1; same_oauth_signing_url = cursor.getInt(indices.same_oauth_signing_url) == 1;
} no_version_suffix = cursor.getInt(indices.no_version_suffix) == 1;
}
@Override @Override
public String toString() { public String toString() {
return "AccountWithCredentials{auth_type=" + auth_type + ", consumer_key=" + consumer_key return "AccountWithCredentials{auth_type=" + auth_type + ", consumer_key=" + consumer_key
+ ", consumer_secret=" + consumer_secret + ", basic_auth_password=" + basic_auth_password + ", consumer_secret=" + consumer_secret + ", basic_auth_password=" + basic_auth_password
+ ", oauth_token=" + oauth_token + ", oauth_token_secret=" + oauth_token_secret + ", oauth_token=" + oauth_token + ", oauth_token_secret=" + oauth_token_secret
+ ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; + ", api_url_format=" + api_url_format + ", same_oauth_signing_url=" + same_oauth_signing_url + "}";
} }
public static final boolean isOfficialCredentials(final Context context, final AccountWithCredentials account) { public static final boolean isOfficialCredentials(final Context context, final AccountWithCredentials account) {
if (account == null) return false; if (account == null) return false;
final boolean isOAuth = account.auth_type == Accounts.AUTH_TYPE_OAUTH final boolean isOAuth = account.auth_type == Accounts.AUTH_TYPE_OAUTH
|| account.auth_type == Accounts.AUTH_TYPE_XAUTH; || account.auth_type == Accounts.AUTH_TYPE_XAUTH;
final String consumerKey = account.consumer_key, consumerSecret = account.consumer_secret; final String consumerKey = account.consumer_key, consumerSecret = account.consumer_secret;
return isOAuth && isOfficialConsumerKeySecret(context, consumerKey, consumerSecret); return isOAuth && isOfficialConsumerKeySecret(context, consumerKey, consumerSecret);
} }
} }
public static final class Indices { public static final class Indices {
public final int screen_name, name, account_id, profile_image_url, profile_banner_url, color, is_activated, public final int screen_name, name, account_id, profile_image_url, profile_banner_url, color, is_activated,
auth_type, consumer_key, consumer_secret, basic_auth_username, basic_auth_password, oauth_token, auth_type, consumer_key, consumer_secret, basic_auth_username, basic_auth_password, oauth_token,
oauth_token_secret, api_url_format, same_oauth_signing_url; oauth_token_secret, api_url_format, same_oauth_signing_url, no_version_suffix;
public Indices(final Cursor cursor) { public Indices(final Cursor cursor) {
screen_name = cursor.getColumnIndex(Accounts.SCREEN_NAME); screen_name = cursor.getColumnIndex(Accounts.SCREEN_NAME);
name = cursor.getColumnIndex(Accounts.NAME); name = cursor.getColumnIndex(Accounts.NAME);
account_id = cursor.getColumnIndex(Accounts.ACCOUNT_ID); account_id = cursor.getColumnIndex(Accounts.ACCOUNT_ID);
profile_image_url = cursor.getColumnIndex(Accounts.PROFILE_IMAGE_URL); profile_image_url = cursor.getColumnIndex(Accounts.PROFILE_IMAGE_URL);
profile_banner_url = cursor.getColumnIndex(Accounts.PROFILE_BANNER_URL); profile_banner_url = cursor.getColumnIndex(Accounts.PROFILE_BANNER_URL);
color = cursor.getColumnIndex(Accounts.COLOR); color = cursor.getColumnIndex(Accounts.COLOR);
is_activated = cursor.getColumnIndex(Accounts.IS_ACTIVATED); is_activated = cursor.getColumnIndex(Accounts.IS_ACTIVATED);
auth_type = cursor.getColumnIndex(Accounts.AUTH_TYPE); auth_type = cursor.getColumnIndex(Accounts.AUTH_TYPE);
consumer_key = cursor.getColumnIndex(Accounts.CONSUMER_KEY); consumer_key = cursor.getColumnIndex(Accounts.CONSUMER_KEY);
consumer_secret = cursor.getColumnIndex(Accounts.CONSUMER_SECRET); consumer_secret = cursor.getColumnIndex(Accounts.CONSUMER_SECRET);
basic_auth_username = cursor.getColumnIndex(Accounts.BASIC_AUTH_USERNAME); basic_auth_username = cursor.getColumnIndex(Accounts.BASIC_AUTH_USERNAME);
basic_auth_password = cursor.getColumnIndex(Accounts.BASIC_AUTH_PASSWORD); basic_auth_password = cursor.getColumnIndex(Accounts.BASIC_AUTH_PASSWORD);
oauth_token = cursor.getColumnIndex(Accounts.OAUTH_TOKEN); oauth_token = cursor.getColumnIndex(Accounts.OAUTH_TOKEN);
oauth_token_secret = cursor.getColumnIndex(Accounts.OAUTH_TOKEN_SECRET); oauth_token_secret = cursor.getColumnIndex(Accounts.OAUTH_TOKEN_SECRET);
api_url_format = cursor.getColumnIndex(Accounts.API_URL_FORMAT); api_url_format = cursor.getColumnIndex(Accounts.API_URL_FORMAT);
same_oauth_signing_url = cursor.getColumnIndex(Accounts.SAME_OAUTH_SIGNING_URL); same_oauth_signing_url = cursor.getColumnIndex(Accounts.SAME_OAUTH_SIGNING_URL);
} no_version_suffix = cursor.getColumnIndex(Accounts.NO_VERSION_SUFFIX);
}
@Override @Override
public String toString() { public String toString() {
return "Indices{screen_name=" + screen_name + ", name=" + name + ", account_id=" + account_id return "Indices{screen_name=" + screen_name + ", name=" + name + ", account_id=" + account_id
+ ", profile_image_url=" + profile_image_url + ", profile_banner_url=" + profile_banner_url + ", profile_image_url=" + profile_image_url + ", profile_banner_url=" + profile_banner_url
+ ", color=" + color + ", is_activated=" + is_activated + ", auth_type=" + auth_type + ", color=" + color + ", is_activated=" + is_activated + ", auth_type=" + auth_type
+ ", consumer_key=" + consumer_key + ", consumer_secret=" + consumer_secret + ", consumer_key=" + consumer_key + ", consumer_secret=" + consumer_secret
+ ", basic_auth_password=" + basic_auth_password + ", oauth_token=" + oauth_token + ", basic_auth_password=" + basic_auth_password + ", oauth_token=" + oauth_token
+ ", oauth_token_secret=" + oauth_token_secret + ", api_url_format=" + api_url_format + ", oauth_token_secret=" + oauth_token_secret + ", api_url_format=" + api_url_format
+ ", same_oauth_signing_url=" + same_oauth_signing_url + "}"; + ", same_oauth_signing_url=" + same_oauth_signing_url + "}";
} }
} }
} }

View File

@ -19,8 +19,6 @@
package org.mariotaku.twidere.util; package org.mariotaku.twidere.util;
import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
import android.content.ContentValues; import android.content.ContentValues;
import org.json.JSONException; import org.json.JSONException;
@ -44,6 +42,9 @@ import org.mariotaku.twidere.provider.TweetStore.Drafts;
import org.mariotaku.twidere.provider.TweetStore.Filters; import org.mariotaku.twidere.provider.TweetStore.Filters;
import org.mariotaku.twidere.provider.TweetStore.Statuses; import org.mariotaku.twidere.provider.TweetStore.Statuses;
import java.util.ArrayList;
import java.util.List;
import twitter4j.DirectMessage; import twitter4j.DirectMessage;
import twitter4j.GeoLocation; import twitter4j.GeoLocation;
import twitter4j.Status; import twitter4j.Status;
@ -54,302 +55,305 @@ import twitter4j.User;
import twitter4j.auth.AccessToken; import twitter4j.auth.AccessToken;
import twitter4j.conf.Configuration; import twitter4j.conf.Configuration;
import java.util.ArrayList; import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
import java.util.List;
public final class ContentValuesCreator implements TwidereConstants { public final class ContentValuesCreator implements TwidereConstants {
public static ContentValues makeAccountContentValuesBasic(final Configuration conf, final String basicUsername, public static ContentValues makeAccountContentValuesBasic(final Configuration conf, final String basicUsername,
final String basicPassword, final User user, final int color, final String apiUrlFormat) { final String basicPassword, final User user, final int color, final String apiUrlFormat,
if (user == null || user.getId() <= 0) return null; final boolean noVersionSuffix) {
final ContentValues values = new ContentValues(); if (user == null || user.getId() <= 0) return null;
if (basicUsername == null || basicPassword == null) return null; final ContentValues values = new ContentValues();
values.put(Accounts.BASIC_AUTH_USERNAME, basicUsername); if (basicUsername == null || basicPassword == null) return null;
values.put(Accounts.BASIC_AUTH_PASSWORD, basicPassword); values.put(Accounts.BASIC_AUTH_USERNAME, basicUsername);
values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_BASIC); values.put(Accounts.BASIC_AUTH_PASSWORD, basicPassword);
values.put(Accounts.ACCOUNT_ID, user.getId()); values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_BASIC);
values.put(Accounts.SCREEN_NAME, user.getScreenName()); values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.NAME, user.getName()); values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.COLOR, color); values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.IS_ACTIVATED, 1); values.put(Accounts.COLOR, color);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat); values.put(Accounts.IS_ACTIVATED, 1);
return values; values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
} values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
return values;
}
public static ContentValues makeAccountContentValuesOAuth(final Configuration conf, final AccessToken accessToken, public static ContentValues makeAccountContentValuesOAuth(final Configuration conf, final AccessToken accessToken,
final User user, final int authType, final int color, final String apiUrlFormat, final User user, final int authType, final int color, final String apiUrlFormat,
final boolean sameOAuthSigningUrl) { final boolean sameOAuthSigningUrl, final boolean noVersionSuffix) {
if (user == null || user.getId() <= 0 || accessToken == null || user.getId() != accessToken.getUserId()) if (user == null || user.getId() <= 0 || accessToken == null || user.getId() != accessToken.getUserId())
return null; return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Accounts.OAUTH_TOKEN, accessToken.getToken()); values.put(Accounts.OAUTH_TOKEN, accessToken.getToken());
values.put(Accounts.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret()); values.put(Accounts.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret());
values.put(Accounts.CONSUMER_KEY, conf.getOAuthConsumerKey()); values.put(Accounts.CONSUMER_KEY, conf.getOAuthConsumerKey());
values.put(Accounts.CONSUMER_SECRET, conf.getOAuthConsumerSecret()); values.put(Accounts.CONSUMER_SECRET, conf.getOAuthConsumerSecret());
values.put(Accounts.AUTH_TYPE, authType); values.put(Accounts.AUTH_TYPE, authType);
values.put(Accounts.ACCOUNT_ID, user.getId()); values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName()); values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName()); values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color); values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1); values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat); values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
values.put(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl); values.put(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl);
return values; values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
} return values;
}
public static ContentValues makeAccountContentValuesTWIP(final Configuration conf, final User user, public static ContentValues makeAccountContentValuesTWIP(final Configuration conf, final User user,
final int color, final String apiUrlFormat) { final int color, final String apiUrlFormat, final boolean noVersionSuffix) {
if (user == null || user.getId() <= 0) return null; if (user == null || user.getId() <= 0) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_TWIP_O_MODE); values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_TWIP_O_MODE);
values.put(Accounts.ACCOUNT_ID, user.getId()); values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName()); values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName()); values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps())); values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl())); values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color); values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1); values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat); values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
return values; values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
} return values;
}
public static ContentValues makeCachedUserContentValues(final User user) { public static ContentValues makeCachedUserContentValues(final User user) {
if (user == null || user.getId() <= 0) return null; if (user == null || user.getId() <= 0) return null;
final String profile_image_url = ParseUtils.parseString(user.getProfileImageUrlHttps()); final String profile_image_url = ParseUtils.parseString(user.getProfileImageUrlHttps());
final String url = ParseUtils.parseString(user.getURL()); final String url = ParseUtils.parseString(user.getURL());
final URLEntity[] urls = user.getURLEntities(); final URLEntity[] urls = user.getURLEntities();
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(CachedUsers.USER_ID, user.getId()); values.put(CachedUsers.USER_ID, user.getId());
values.put(CachedUsers.NAME, user.getName()); values.put(CachedUsers.NAME, user.getName());
values.put(CachedUsers.SCREEN_NAME, user.getScreenName()); values.put(CachedUsers.SCREEN_NAME, user.getScreenName());
values.put(CachedUsers.PROFILE_IMAGE_URL, profile_image_url); values.put(CachedUsers.PROFILE_IMAGE_URL, profile_image_url);
values.put(CachedUsers.CREATED_AT, user.getCreatedAt().getTime()); values.put(CachedUsers.CREATED_AT, user.getCreatedAt().getTime());
values.put(CachedUsers.IS_PROTECTED, user.isProtected()); values.put(CachedUsers.IS_PROTECTED, user.isProtected());
values.put(CachedUsers.IS_VERIFIED, user.isVerified()); values.put(CachedUsers.IS_VERIFIED, user.isVerified());
values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); values.put(CachedUsers.IS_FOLLOWING, user.isFollowing());
values.put(CachedUsers.FAVORITES_COUNT, user.getFavouritesCount()); values.put(CachedUsers.FAVORITES_COUNT, user.getFavouritesCount());
values.put(CachedUsers.FOLLOWERS_COUNT, user.getFollowersCount()); values.put(CachedUsers.FOLLOWERS_COUNT, user.getFollowersCount());
values.put(CachedUsers.FRIENDS_COUNT, user.getFriendsCount()); values.put(CachedUsers.FRIENDS_COUNT, user.getFriendsCount());
values.put(CachedUsers.STATUSES_COUNT, user.getStatusesCount()); values.put(CachedUsers.STATUSES_COUNT, user.getStatusesCount());
values.put(CachedUsers.LOCATION, user.getLocation()); values.put(CachedUsers.LOCATION, user.getLocation());
values.put(CachedUsers.DESCRIPTION_PLAIN, user.getDescription()); values.put(CachedUsers.DESCRIPTION_PLAIN, user.getDescription());
values.put(CachedUsers.DESCRIPTION_HTML, Utils.formatUserDescription(user)); values.put(CachedUsers.DESCRIPTION_HTML, Utils.formatUserDescription(user));
values.put(CachedUsers.DESCRIPTION_EXPANDED, Utils.formatExpandedUserDescription(user)); values.put(CachedUsers.DESCRIPTION_EXPANDED, Utils.formatExpandedUserDescription(user));
values.put(CachedUsers.URL, url); values.put(CachedUsers.URL, url);
values.put(CachedUsers.URL_EXPANDED, values.put(CachedUsers.URL_EXPANDED,
url != null && urls != null && urls.length > 0 ? ParseUtils.parseString(urls[0].getExpandedURL()) url != null && urls != null && urls.length > 0 ? ParseUtils.parseString(urls[0].getExpandedURL())
: null); : null);
values.put(CachedUsers.PROFILE_BANNER_URL, user.getProfileBannerImageUrl()); values.put(CachedUsers.PROFILE_BANNER_URL, user.getProfileBannerImageUrl());
return values; return values;
} }
public static ContentValues makeDirectMessageContentValues(final DirectMessage message, final long account_id, public static ContentValues makeDirectMessageContentValues(final DirectMessage message, final long account_id,
final boolean is_outgoing) { final boolean is_outgoing) {
if (message == null || message.getId() <= 0) return null; if (message == null || message.getId() <= 0) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
final User sender = message.getSender(), recipient = message.getRecipient(); final User sender = message.getSender(), recipient = message.getRecipient();
if (sender == null || recipient == null) return null; if (sender == null || recipient == null) return null;
final String sender_profile_image_url = ParseUtils.parseString(sender.getProfileImageUrlHttps()); final String sender_profile_image_url = ParseUtils.parseString(sender.getProfileImageUrlHttps());
final String recipient_profile_image_url = ParseUtils.parseString(recipient.getProfileImageUrlHttps()); final String recipient_profile_image_url = ParseUtils.parseString(recipient.getProfileImageUrlHttps());
values.put(DirectMessages.ACCOUNT_ID, account_id); values.put(DirectMessages.ACCOUNT_ID, account_id);
values.put(DirectMessages.MESSAGE_ID, message.getId()); values.put(DirectMessages.MESSAGE_ID, message.getId());
values.put(DirectMessages.MESSAGE_TIMESTAMP, message.getCreatedAt().getTime()); values.put(DirectMessages.MESSAGE_TIMESTAMP, message.getCreatedAt().getTime());
values.put(DirectMessages.SENDER_ID, sender.getId()); values.put(DirectMessages.SENDER_ID, sender.getId());
values.put(DirectMessages.RECIPIENT_ID, recipient.getId()); values.put(DirectMessages.RECIPIENT_ID, recipient.getId());
final String text_html = Utils.formatDirectMessageText(message); final String text_html = Utils.formatDirectMessageText(message);
values.put(DirectMessages.TEXT_HTML, text_html); values.put(DirectMessages.TEXT_HTML, text_html);
values.put(DirectMessages.TEXT_PLAIN, message.getText()); values.put(DirectMessages.TEXT_PLAIN, message.getText());
values.put(DirectMessages.TEXT_UNESCAPED, toPlainText(text_html)); values.put(DirectMessages.TEXT_UNESCAPED, toPlainText(text_html));
values.put(DirectMessages.IS_OUTGOING, is_outgoing); values.put(DirectMessages.IS_OUTGOING, is_outgoing);
values.put(DirectMessages.SENDER_NAME, sender.getName()); values.put(DirectMessages.SENDER_NAME, sender.getName());
values.put(DirectMessages.SENDER_SCREEN_NAME, sender.getScreenName()); values.put(DirectMessages.SENDER_SCREEN_NAME, sender.getScreenName());
values.put(DirectMessages.RECIPIENT_NAME, recipient.getName()); values.put(DirectMessages.RECIPIENT_NAME, recipient.getName());
values.put(DirectMessages.RECIPIENT_SCREEN_NAME, recipient.getScreenName()); values.put(DirectMessages.RECIPIENT_SCREEN_NAME, recipient.getScreenName());
values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, sender_profile_image_url); values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, sender_profile_image_url);
values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url); values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url);
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(message); final ParcelableMedia[] medias = ParcelableMedia.fromEntities(message);
if (medias != null) { if (medias != null) {
values.put(DirectMessages.MEDIAS, JSONSerializer.toJSONArrayString(medias)); values.put(DirectMessages.MEDIAS, JSONSerializer.toJSONArrayString(medias));
values.put(DirectMessages.FIRST_MEDIA, medias[0].url); values.put(DirectMessages.FIRST_MEDIA, medias[0].url);
} }
return values; return values;
} }
public static ContentValues makeDirectMessageContentValues(final ParcelableDirectMessage message) { public static ContentValues makeDirectMessageContentValues(final ParcelableDirectMessage message) {
if (message == null || message.id <= 0) return null; if (message == null || message.id <= 0) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(DirectMessages.ACCOUNT_ID, message.account_id); values.put(DirectMessages.ACCOUNT_ID, message.account_id);
values.put(DirectMessages.MESSAGE_ID, message.id); values.put(DirectMessages.MESSAGE_ID, message.id);
values.put(DirectMessages.MESSAGE_TIMESTAMP, message.timestamp); values.put(DirectMessages.MESSAGE_TIMESTAMP, message.timestamp);
values.put(DirectMessages.SENDER_ID, message.sender_id); values.put(DirectMessages.SENDER_ID, message.sender_id);
values.put(DirectMessages.RECIPIENT_ID, message.recipient_id); values.put(DirectMessages.RECIPIENT_ID, message.recipient_id);
values.put(DirectMessages.TEXT_HTML, message.text_html); values.put(DirectMessages.TEXT_HTML, message.text_html);
values.put(DirectMessages.TEXT_PLAIN, message.text_plain); values.put(DirectMessages.TEXT_PLAIN, message.text_plain);
values.put(DirectMessages.IS_OUTGOING, message.is_outgoing); values.put(DirectMessages.IS_OUTGOING, message.is_outgoing);
values.put(DirectMessages.SENDER_NAME, message.sender_name); values.put(DirectMessages.SENDER_NAME, message.sender_name);
values.put(DirectMessages.SENDER_SCREEN_NAME, message.sender_screen_name); values.put(DirectMessages.SENDER_SCREEN_NAME, message.sender_screen_name);
values.put(DirectMessages.RECIPIENT_NAME, message.recipient_name); values.put(DirectMessages.RECIPIENT_NAME, message.recipient_name);
values.put(DirectMessages.RECIPIENT_SCREEN_NAME, message.recipient_screen_name); values.put(DirectMessages.RECIPIENT_SCREEN_NAME, message.recipient_screen_name);
values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, message.sender_profile_image_url); values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, message.sender_profile_image_url);
values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url); values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url);
if (message.medias != null) { if (message.medias != null) {
values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(message.medias)); values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(message.medias));
values.put(Statuses.FIRST_MEDIA, message.medias[0].url); values.put(Statuses.FIRST_MEDIA, message.medias[0].url);
} }
return values; return values;
} }
public static ContentValues makeDirectMessageDraftContentValues(final long accountId, final long recipientId, public static ContentValues makeDirectMessageDraftContentValues(final long accountId, final long recipientId,
final String text, final String imageUri) { final String text, final String imageUri) {
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Drafts.ACTION_SEND_DIRECT_MESSAGE); values.put(Drafts.ACTION_TYPE, Drafts.ACTION_SEND_DIRECT_MESSAGE);
values.put(Drafts.TEXT, text); values.put(Drafts.TEXT, text);
values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(new long[] { accountId }, ',', false)); values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(new long[]{accountId}, ',', false));
values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (imageUri != null) { if (imageUri != null) {
final ParcelableMediaUpdate[] medias = { new ParcelableMediaUpdate(imageUri, 0) }; final ParcelableMediaUpdate[] medias = {new ParcelableMediaUpdate(imageUri, 0)};
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias)); values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias));
} }
final JSONObject extras = new JSONObject(); final JSONObject extras = new JSONObject();
try { try {
extras.put(EXTRA_RECIPIENT_ID, recipientId); extras.put(EXTRA_RECIPIENT_ID, recipientId);
} catch (final JSONException e) { } catch (final JSONException e) {
e.printStackTrace(); e.printStackTrace();
} }
values.put(Drafts.ACTION_EXTRAS, extras.toString()); values.put(Drafts.ACTION_EXTRAS, extras.toString());
return values; return values;
} }
public static ContentValues makeFilterdUserContentValues(final ParcelableStatus status) { public static ContentValues makeFilteredUserContentValues(final ParcelableStatus status) {
if (status == null) return null; if (status == null) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, status.user_id); values.put(Filters.Users.USER_ID, status.user_id);
values.put(Filters.Users.NAME, status.user_name); values.put(Filters.Users.NAME, status.user_name);
values.put(Filters.Users.SCREEN_NAME, status.user_screen_name); values.put(Filters.Users.SCREEN_NAME, status.user_screen_name);
return values; return values;
} }
public static ContentValues makeFilterdUserContentValues(final ParcelableUser user) { public static ContentValues makeFilteredUserContentValues(final ParcelableUser user) {
if (user == null) return null; if (user == null) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, user.id); values.put(Filters.Users.USER_ID, user.id);
values.put(Filters.Users.NAME, user.name); values.put(Filters.Users.NAME, user.name);
values.put(Filters.Users.SCREEN_NAME, user.screen_name); values.put(Filters.Users.SCREEN_NAME, user.screen_name);
return values; return values;
} }
public static ContentValues makeFilterdUserContentValues(final ParcelableUserMention user) { public static ContentValues makeFilteredUserContentValues(final ParcelableUserMention user) {
if (user == null) return null; if (user == null) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, user.id); values.put(Filters.Users.USER_ID, user.id);
values.put(Filters.Users.NAME, user.name); values.put(Filters.Users.NAME, user.name);
values.put(Filters.Users.SCREEN_NAME, user.screen_name); values.put(Filters.Users.SCREEN_NAME, user.screen_name);
return values; return values;
} }
public static ContentValues makeStatusContentValues(final Status orig, final long account_id) { public static ContentValues makeStatusContentValues(final Status orig, final long account_id) {
if (orig == null || orig.getId() <= 0) return null; if (orig == null || orig.getId() <= 0) return null;
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Statuses.ACCOUNT_ID, account_id); values.put(Statuses.ACCOUNT_ID, account_id);
values.put(Statuses.STATUS_ID, orig.getId()); values.put(Statuses.STATUS_ID, orig.getId());
values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime()); values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime());
values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet()); values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet());
final boolean is_retweet = orig.isRetweet(); final boolean isRetweet = orig.isRetweet();
final Status status; final Status status;
final Status retweeted_status = is_retweet ? orig.getRetweetedStatus() : null; final Status retweetedStatus = isRetweet ? orig.getRetweetedStatus() : null;
if (retweeted_status != null) { if (retweetedStatus != null) {
final User retweet_user = orig.getUser(); final User retweetUser = orig.getUser();
values.put(Statuses.RETWEET_ID, retweeted_status.getId()); values.put(Statuses.RETWEET_ID, retweetedStatus.getId());
values.put(Statuses.RETWEET_TIMESTAMP, retweeted_status.getCreatedAt().getTime()); values.put(Statuses.RETWEET_TIMESTAMP, retweetedStatus.getCreatedAt().getTime());
values.put(Statuses.RETWEETED_BY_USER_ID, retweet_user.getId()); values.put(Statuses.RETWEETED_BY_USER_ID, retweetUser.getId());
values.put(Statuses.RETWEETED_BY_USER_NAME, retweet_user.getName()); values.put(Statuses.RETWEETED_BY_USER_NAME, retweetUser.getName());
values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweet_user.getScreenName()); values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweetUser.getScreenName());
status = retweeted_status; status = retweetedStatus;
} else { } else {
status = orig; status = orig;
} }
final User user = status.getUser(); final User user = status.getUser();
if (user != null) { if (user != null) {
final long userId = user.getId(); final long userId = user.getId();
final String profileImageUrl = ParseUtils.parseString(user.getProfileImageUrlHttps()); final String profileImageUrl = ParseUtils.parseString(user.getProfileImageUrlHttps());
final String name = user.getName(), screenName = user.getScreenName(); final String name = user.getName(), screenName = user.getScreenName();
values.put(Statuses.USER_ID, userId); values.put(Statuses.USER_ID, userId);
values.put(Statuses.USER_NAME, name); values.put(Statuses.USER_NAME, name);
values.put(Statuses.USER_SCREEN_NAME, screenName); values.put(Statuses.USER_SCREEN_NAME, screenName);
values.put(Statuses.IS_PROTECTED, user.isProtected()); values.put(Statuses.IS_PROTECTED, user.isProtected());
values.put(Statuses.IS_VERIFIED, user.isVerified()); values.put(Statuses.IS_VERIFIED, user.isVerified());
values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl); values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl);
values.put(CachedUsers.IS_FOLLOWING, user.isFollowing()); values.put(CachedUsers.IS_FOLLOWING, user.isFollowing());
} }
final String text_html = Utils.formatStatusText(status); final String text_html = Utils.formatStatusText(status);
values.put(Statuses.TEXT_HTML, text_html); values.put(Statuses.TEXT_HTML, text_html);
values.put(Statuses.TEXT_PLAIN, status.getText()); values.put(Statuses.TEXT_PLAIN, status.getText());
values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html)); values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html));
values.put(Statuses.RETWEET_COUNT, status.getRetweetCount()); values.put(Statuses.RETWEET_COUNT, status.getRetweetCount());
values.put(Statuses.IN_REPLY_TO_STATUS_ID, status.getInReplyToStatusId()); values.put(Statuses.IN_REPLY_TO_STATUS_ID, status.getInReplyToStatusId());
values.put(Statuses.IN_REPLY_TO_USER_ID, status.getInReplyToUserId()); values.put(Statuses.IN_REPLY_TO_USER_ID, status.getInReplyToUserId());
values.put(Statuses.IN_REPLY_TO_USER_NAME, Utils.getInReplyToName(status)); values.put(Statuses.IN_REPLY_TO_USER_NAME, Utils.getInReplyToName(status));
values.put(Statuses.IN_REPLY_TO_USER_SCREEN_NAME, status.getInReplyToScreenName()); values.put(Statuses.IN_REPLY_TO_USER_SCREEN_NAME, status.getInReplyToScreenName());
values.put(Statuses.SOURCE, status.getSource()); values.put(Statuses.SOURCE, status.getSource());
values.put(Statuses.IS_POSSIBLY_SENSITIVE, status.isPossiblySensitive()); values.put(Statuses.IS_POSSIBLY_SENSITIVE, status.isPossiblySensitive());
final GeoLocation location = status.getGeoLocation(); final GeoLocation location = status.getGeoLocation();
if (location != null) { if (location != null) {
values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude()); values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude());
} }
values.put(Statuses.IS_RETWEET, is_retweet); values.put(Statuses.IS_RETWEET, isRetweet);
values.put(Statuses.IS_FAVORITE, status.isFavorited()); values.put(Statuses.IS_FAVORITE, status.isFavorited());
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status); final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status);
if (medias != null) { if (medias != null) {
values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(medias)); values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(medias));
values.put(Statuses.FIRST_MEDIA, medias[0].url); values.put(Statuses.FIRST_MEDIA, medias[0].url);
} }
final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status); final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status);
if (mentions != null) { if (mentions != null) {
values.put(Statuses.MENTIONS, JSONSerializer.toJSONArrayString(mentions)); values.put(Statuses.MENTIONS, JSONSerializer.toJSONArrayString(mentions));
} }
return values; return values;
} }
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) { public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) {
return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts)); return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts));
} }
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status, public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status,
final long[] accountIds) { final long[] accountIds) {
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Drafts.ACTION_UPDATE_STATUS); values.put(Drafts.ACTION_TYPE, Drafts.ACTION_UPDATE_STATUS);
values.put(Drafts.TEXT, status.text); values.put(Drafts.TEXT, status.text);
values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(accountIds, ',', false)); values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(accountIds, ',', false));
values.put(Drafts.IN_REPLY_TO_STATUS_ID, status.in_reply_to_status_id); values.put(Drafts.IN_REPLY_TO_STATUS_ID, status.in_reply_to_status_id);
values.put(Drafts.LOCATION, ParcelableLocation.toString(status.location)); values.put(Drafts.LOCATION, ParcelableLocation.toString(status.location));
values.put(Drafts.IS_POSSIBLY_SENSITIVE, status.is_possibly_sensitive); values.put(Drafts.IS_POSSIBLY_SENSITIVE, status.is_possibly_sensitive);
values.put(Drafts.TIMESTAMP, System.currentTimeMillis()); values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (status.medias != null) { if (status.medias != null) {
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(status.medias)); values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(status.medias));
} }
return values; return values;
} }
public static ContentValues[] makeTrendsContentValues(final List<Trends> trends_list) { public static ContentValues[] makeTrendsContentValues(final List<Trends> trendsList) {
if (trends_list == null) return new ContentValues[0]; if (trendsList == null) return new ContentValues[0];
final List<ContentValues> result_list = new ArrayList<ContentValues>(); final List<ContentValues> resultList = new ArrayList<>();
for (final Trends trends : trends_list) { for (final Trends trends : trendsList) {
if (trends == null) { if (trends == null) {
continue; continue;
} }
final long timestamp = trends.getTrendAt().getTime(); final long timestamp = trends.getTrendAt().getTime();
for (final Trend trend : trends.getTrends()) { for (final Trend trend : trends.getTrends()) {
final ContentValues values = new ContentValues(); final ContentValues values = new ContentValues();
values.put(CachedTrends.NAME, trend.getName()); values.put(CachedTrends.NAME, trend.getName());
values.put(CachedTrends.TIMESTAMP, timestamp); values.put(CachedTrends.TIMESTAMP, timestamp);
result_list.add(values); resultList.add(values);
} }
} }
return result_list.toArray(new ContentValues[result_list.size()]); return resultList.toArray(new ContentValues[resultList.size()]);
} }
} }

View File

@ -52,7 +52,6 @@ import java.util.TreeSet;
import de.keyboardsurfer.android.widget.crouton.Crouton; import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.CroutonStyle; import de.keyboardsurfer.android.widget.crouton.CroutonStyle;
import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues;
import static org.mariotaku.twidere.util.Utils.getAccountScreenNames; import static org.mariotaku.twidere.util.Utils.getAccountScreenNames;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkDelete;
import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert; import static org.mariotaku.twidere.util.content.ContentResolverUtils.bulkInsert;
@ -145,11 +144,11 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
if (object instanceof ParcelableStatus) { if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object; final ParcelableStatus status = (ParcelableStatus) object;
userIds.add(status.user_id); userIds.add(status.user_id);
valuesList.add(makeFilterdUserContentValues(status)); valuesList.add(ContentValuesCreator.makeFilteredUserContentValues(status));
} else if (object instanceof ParcelableUser) { } else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object; final ParcelableUser user = (ParcelableUser) object;
userIds.add(user.id); userIds.add(user.id);
valuesList.add(makeFilterdUserContentValues(user)); valuesList.add(ContentValuesCreator.makeFilteredUserContentValues(user));
} else { } else {
continue; continue;
} }

View File

@ -1,5 +0,0 @@
package org.mariotaku.twidere.util;
public class SpannableStringBuilder {
}

View File

@ -35,10 +35,14 @@ import android.support.annotation.NonNull;
import android.text.TextPaint; import android.text.TextPaint;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarMenuInfo;
import org.mariotaku.refreshnow.widget.RefreshNowConfig; import org.mariotaku.refreshnow.widget.RefreshNowConfig;
import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator.IndicatorConfig; import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator.IndicatorConfig;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
@ -114,6 +118,25 @@ public class ThemeUtils implements Constants {
d.setAlpha(getUserThemeBackgroundAlpha(context)); d.setAlpha(getUserThemeBackgroundAlpha(context));
} }
public static void applyColorFilterToMenuIcon(Menu menu, int color, int popupColor, PorterDuff.Mode mode, int... excludedGroups) {
for (int i = 0, j = menu.size(); i < j; i++) {
final MenuItem item = menu.getItem(i);
final Drawable icon = item.getIcon();
final ContextMenuInfo info = item.getMenuInfo();
if (ArrayUtils.contains(excludedGroups, item.getGroupId())) {
icon.mutate().clearColorFilter();
} else if (info instanceof MenuBarMenuInfo) {
final boolean inPopup = ((MenuBarMenuInfo) info).isInPopup();
icon.mutate().setColorFilter(inPopup ? popupColor : color, mode);
} else {
icon.mutate().setColorFilter(color, mode);
}
if (item.hasSubMenu()) {
applyColorFilterToMenuIcon(item.getSubMenu(), color, popupColor, mode, excludedGroups);
}
}
}
public static IndicatorConfig buildRefreshIndicatorConfig(final Context context) { public static IndicatorConfig buildRefreshIndicatorConfig(final Context context) {
final IndicatorConfig.Builder builder = new IndicatorConfig.Builder(context); final IndicatorConfig.Builder builder = new IndicatorConfig.Builder(context);
final Resources res = context.getResources(); final Resources res = context.getResources();

View File

@ -1493,7 +1493,8 @@ public final class Utils implements Constants, TwitterConstants {
public static String getApiUrl(final String pattern, final String domain, final String appendPath) { public static String getApiUrl(final String pattern, final String domain, final String appendPath) {
final String urlBase = getApiBaseUrl(pattern, domain); final String urlBase = getApiBaseUrl(pattern, domain);
if (urlBase == null || appendPath == null) return urlBase; if (urlBase == null) return null;
if (appendPath == null) return urlBase.endsWith("/") ? urlBase : urlBase + "/";
final StringBuilder sb = new StringBuilder(urlBase); final StringBuilder sb = new StringBuilder(urlBase);
if (urlBase.endsWith("/")) { if (urlBase.endsWith("/")) {
sb.append(appendPath.startsWith("/") ? appendPath.substring(1) : appendPath); sb.append(appendPath.startsWith("/") ? appendPath.substring(1) : appendPath);
@ -2250,9 +2251,10 @@ public final class Utils implements Constants, TwitterConstants {
final String prefConsumerSecret = prefs.getString(KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET); final String prefConsumerSecret = prefs.getString(KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET);
final ConfigurationBuilder cb = new ConfigurationBuilder(); final ConfigurationBuilder cb = new ConfigurationBuilder();
if (!isEmpty(account.api_url_format)) { if (!isEmpty(account.api_url_format)) {
cb.setRestBaseURL(getApiUrl(account.api_url_format, "api", "/1.1/")); final String versionSuffix = account.no_version_suffix ? null : "/1.1/";
cb.setRestBaseURL(getApiUrl(account.api_url_format, "api", versionSuffix));
cb.setOAuthBaseURL(getApiUrl(account.api_url_format, "api", "/oauth/")); cb.setOAuthBaseURL(getApiUrl(account.api_url_format, "api", "/oauth/"));
cb.setUploadBaseURL(getApiUrl(account.api_url_format, "upload", "/1.1/")); cb.setUploadBaseURL(getApiUrl(account.api_url_format, "upload", versionSuffix));
if (!account.same_oauth_signing_url) { if (!account.same_oauth_signing_url) {
cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_BASE_URL); cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_BASE_URL);
cb.setSigningOAuthBaseURL(DEFAULT_SIGNING_OAUTH_BASE_URL); cb.setSigningOAuthBaseURL(DEFAULT_SIGNING_OAUTH_BASE_URL);
@ -2291,7 +2293,7 @@ public final class Utils implements Constants, TwitterConstants {
final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL(); final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, where.toString(), null, null); Accounts.COLUMNS, where, null, null);
if (c == null) return null; if (c == null) return null;
try { try {
if (!c.moveToFirst()) return null; if (!c.moveToFirst()) return null;
@ -2416,7 +2418,7 @@ public final class Utils implements Constants, TwitterConstants {
// versions // versions
final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL(); final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI, final Cursor c = ContentResolverUtils.query(context.getContentResolver(), Accounts.CONTENT_URI,
Accounts.COLUMNS, where.toString(), null, null); Accounts.COLUMNS, where, null, null);
if (c == null) return null; if (c == null) return null;
try { try {
if (!c.moveToFirst()) return null; if (!c.moveToFirst()) return null;
@ -2793,22 +2795,22 @@ public final class Utils implements Constants, TwitterConstants {
// SCREENLAYOUT_LAYOUTDIR_RTL; // SCREENLAYOUT_LAYOUTDIR_RTL;
} }
public static boolean isSameAccount(final Context context, final long account_id, final long user_id) { public static boolean isSameAccount(final Context context, final long accountId, final long userId) {
if (context == null || account_id <= 0 || user_id <= 0) return false; if (context == null || accountId <= 0 || userId <= 0) return false;
return account_id == user_id; return accountId == userId;
} }
public static boolean isSameAccount(final Context context, final long account_id, final String screen_name) { public static boolean isSameAccount(final Context context, final long accountId, final String screenName) {
if (context == null || account_id <= 0 || screen_name == null) return false; if (context == null || accountId <= 0 || screenName == null) return false;
return screen_name.equalsIgnoreCase(getAccountScreenName(context, account_id)); return screenName.equalsIgnoreCase(getAccountScreenName(context, accountId));
} }
public static boolean isUserLoggedIn(final Context context, final long account_id) { public static boolean isUserLoggedIn(final Context context, final long accountId) {
if (context == null) return false; if (context == null) return false;
final long[] ids = getAccountIds(context); final long[] ids = getAccountIds(context);
if (ids == null) return false; if (ids == null) return false;
for (final long id : ids) { for (final long id : ids) {
if (id == account_id) return true; if (id == accountId) return true;
} }
return false; return false;
} }
@ -3483,11 +3485,11 @@ public final class Utils implements Constants, TwitterConstants {
addIntentToMenuForExtension(context, menu, MENU_GROUP_STATUS_EXTENSION, INTENT_ACTION_EXTENSION_OPEN_STATUS, addIntentToMenuForExtension(context, menu, MENU_GROUP_STATUS_EXTENSION, INTENT_ACTION_EXTENSION_OPEN_STATUS,
EXTRA_STATUS, EXTRA_STATUS_JSON, status); EXTRA_STATUS, EXTRA_STATUS_JSON, status);
final MenuItem shareItem = menu.findItem(R.id.share_submenu); final MenuItem shareItem = menu.findItem(R.id.share_submenu);
final Menu shareSubmenu = shareItem != null && shareItem.hasSubMenu() ? shareItem.getSubMenu() : null; final Menu shareSubMenu = shareItem != null && shareItem.hasSubMenu() ? shareItem.getSubMenu() : null;
if (shareSubmenu != null) { if (shareSubMenu != null) {
final Intent shareIntent = createStatusShareIntent(context, status); final Intent shareIntent = createStatusShareIntent(context, status);
shareSubmenu.removeGroup(MENU_GROUP_STATUS_SHARE); shareSubMenu.removeGroup(MENU_GROUP_STATUS_SHARE);
addIntentToMenu(context, shareSubmenu, shareIntent, MENU_GROUP_STATUS_SHARE); addIntentToMenu(context, shareSubMenu, shareIntent, MENU_GROUP_STATUS_SHARE);
} }
} }
@ -3813,15 +3815,13 @@ public final class Utils implements Constants, TwitterConstants {
} }
private static boolean isExtensionUseJSON(final ResolveInfo info) { private static boolean isExtensionUseJSON(final ResolveInfo info) {
if (info == null || info.activityInfo == null) return true; if (info == null || info.activityInfo == null) return false;
final ActivityInfo activityInfo = info.activityInfo; final ActivityInfo activityInfo = info.activityInfo;
if (activityInfo.metaData != null && activityInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON)) if (activityInfo.metaData != null && activityInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON))
return activityInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON); return activityInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON);
final ApplicationInfo appInfo = activityInfo.applicationInfo; final ApplicationInfo appInfo = activityInfo.applicationInfo;
if (appInfo == null) return true; if (appInfo == null) return false;
if (appInfo.metaData != null && appInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON)) return appInfo.metaData != null && appInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON, false);
return appInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON);
return true;
} }
private static void parseEntities(final HtmlBuilder builder, final EntitySupport entities) { private static void parseEntities(final HtmlBuilder builder, final EntitySupport entities) {
@ -3879,7 +3879,7 @@ public final class Utils implements Constants, TwitterConstants {
/** /**
* Get most contrasting color * Get most contrasting color
* *
* @param color * @param color Input color, alpha channel will be disposed.
* @return {@link Color#WHITE} or {@link Color#BLACK} * @return {@link Color#WHITE} or {@link Color#BLACK}
* @see <a href='http://24ways.org/2010/calculating-color-contrast/'>Calculating Color Contrast</a> * @see <a href='http://24ways.org/2010/calculating-color-contrast/'>Calculating Color Contrast</a>
*/ */

View File

@ -1,26 +1,46 @@
package org.mariotaku.twidere.view; package org.mariotaku.twidere.view;
import android.content.Context; import android.content.Context;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MenuInflater; import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import org.mariotaku.menucomponent.widget.MenuBar; import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.twidere.menu.TwidereMenuInflater; import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.util.ThemeUtils;
/** /**
* Created by mariotaku on 14-7-29. * Created by mariotaku on 14-7-29.
*/ */
public class TwidereMenuBar extends MenuBar { public class TwidereMenuBar extends MenuBar implements MenuBarListener, Constants {
private OnMenuItemClickListener mListener;
public TwidereMenuBar(Context context) { public TwidereMenuBar(Context context) {
super(context); super(context);
} }
public TwidereMenuBar(Context context, AttributeSet attrs) { public TwidereMenuBar(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
setMenuBarListener(this);
}
public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
mListener = listener;
} }
@Override @Override
public MenuInflater getMenuInflater() { public void onPreShowMenu(Menu menu) {
return new TwidereMenuInflater(getContext()); final int color = ThemeUtils.getTextColorPrimary(getItemViewContext());
final int popupColor = ThemeUtils.getTextColorPrimary(getPopupContext());
ThemeUtils.applyColorFilterToMenuIcon(menu, color, popupColor, Mode.SRC_ATOP,
MENU_GROUP_STATUS_SHARE, MENU_GROUP_STATUS_EXTENSION);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return mListener != null && mListener.onMenuItemClick(item);
} }
} }

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.HomeActionButton <org.mariotaku.twidere.view.HomeActionButton
android:id="@+id/actions_button_bottom" android:id="@+id/actions_button"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/float_action_button_size" android:layout_width="@dimen/float_action_button_size"
android:layout_height="@dimen/float_action_button_size" android:layout_height="@dimen/float_action_button_size"

View File

@ -3,11 +3,11 @@
<ProgressBar <ProgressBar
android:id="@android:id/progress" android:id="@android:id/progress"
style="?android:attr/progressBarStyleLarge" style="?android:attr/progressBarStyle"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_margin="@dimen/element_spacing_small" android:layout_margin="@dimen/element_spacing_normal"
android:visibility="gone"/> android:visibility="gone"/>
<ImageView <ImageView

View File

@ -1,47 +1,57 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
android:id="@+id/advanced_api_config" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:id="@+id/advanced_api_config"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:layout_below="@+id/advanced_api_config_label" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_below="@+id/advanced_api_config_label"
android:paddingLeft="@dimen/element_spacing_normal"> android:orientation="vertical"
android:paddingLeft="@dimen/element_spacing_normal">
<CheckBox <CheckBox
android:id="@+id/same_oauth_signing_url" android:id="@+id/same_oauth_signing_url"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_normal" android:paddingBottom="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_normal" android:paddingTop="@dimen/element_spacing_normal"
android:text="@string/same_oauth_signing_url" android:text="@string/same_oauth_signing_url"
android:textAppearance="?android:attr/textAppearanceSmall"/> android:textAppearance="?android:attr/textAppearanceSmall"/>
<TextView <CheckBox
android:layout_width="match_parent" android:id="@+id/no_version_suffix"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:text="@string/consumer_key" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"/> android:paddingBottom="@dimen/element_spacing_normal"
android:paddingTop="@dimen/element_spacing_normal"
android:text="@string/no_version_suffix"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<EditText <TextView
android:id="@+id/consumer_key" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:text="@string/consumer_key"
android:ems="10" android:textAppearance="?android:attr/textAppearanceSmall"/>
android:inputType="text|textVisiblePassword"
android:singleLine="true"/>
<TextView <EditText
android:layout_width="match_parent" android:id="@+id/consumer_key"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:text="@string/consumer_secret" android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceSmall"/> android:ems="10"
android:inputType="text|textVisiblePassword"
android:singleLine="true"/>
<EditText <TextView
android:id="@+id/consumer_secret" android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:text="@string/consumer_secret"
android:ems="10" android:textAppearance="?android:attr/textAppearanceSmall"/>
android:inputType="text|textVisiblePassword"
android:singleLine="true"/> <EditText
android:id="@+id/consumer_secret"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text|textVisiblePassword"
android:singleLine="true"/>
</LinearLayout> </LinearLayout>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.mariotaku.twidere.view.HomeActionButtonCompat <org.mariotaku.twidere.view.HomeActionButtonCompat
android:id="@+id/actions_button_bottom" android:id="@+id/actions_button"
style="?android:buttonStyle" style="?android:buttonStyle"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/float_action_button_size" android:layout_width="@dimen/float_action_button_size"

View File

@ -645,5 +645,6 @@
<string name="excluded">Excluded</string> <string name="excluded">Excluded</string>
<string name="exclude_this_host">Exclude this host</string> <string name="exclude_this_host">Exclude this host</string>
<string name="api_url_format_help">[DOMAIN]: Twitter API domain.\nExample: https://[DOMAIN].twitter.com/ will be replaced to https://api.twitter.com/.</string> <string name="api_url_format_help">[DOMAIN]: Twitter API domain.\nExample: https://[DOMAIN].twitter.com/ will be replaced to https://api.twitter.com/.</string>
<string name="no_version_suffix">No version suffix</string>
</resources> </resources>