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(':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 {
compileSdkVersion 21
buildToolsVersion '21.0.1'
buildToolsVersion '21.0.2'
defaultConfig {
applicationId "org.mariotaku.twidere"
@ -69,7 +69,9 @@ android {
}
dependencies {
wearApp project(':twidere.wear')
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:recyclerview-v7:21.0.0'
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.ThreadPool;
import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
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,
GLImageLoader.DownloadListener, LoaderManager.LoaderCallbacks<GLImageLoader.Result>, OnMenuVisibilityListener,
SwipeListener, OnMenuItemClickListener {
SwipeListener, MenuBarListener {
private final GLView mRootPane = new GLView() {
@Override
@ -340,7 +341,7 @@ public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implem
if (savedInstanceState == null) {
loadImage();
}
mMenuBar.setOnMenuItemClickListener(this);
mMenuBar.setMenuBarListener(this);
mMenuBar.inflate(R.menu.menu_image_viewer);
mMenuBar.setIsBottomBar(true);
mMenuBar.show();
@ -531,6 +532,11 @@ public final class ImageViewerGLActivity extends TwidereSwipeBackActivity implem
Utils.addIntentToMenu(this, subMenu, shareIntent);
}
@Override
public void onPreShowMenu(Menu menu) {
}
private static class MyHandler extends SynchronizedHandler {
ImageViewerGLActivity activity;

View File

@ -28,7 +28,7 @@ package org.mariotaku.twidere;
public interface Constants extends TwidereConstants {
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_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.model.ParcelableUser;
import org.mariotaku.twidere.provider.TweetStore.Filters;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
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))
return;
final ParcelableUser user = data.getParcelableExtra(EXTRA_USER);
final ContentValues values = makeFilterdUserContentValues(user);
final ContentValues values = ContentValuesCreator.makeFilteredUserContentValues(user);
final ContentResolver resolver = getContentResolver();
resolver.delete(Filters.Users.CONTENT_URI, Where.equals(Filters.Users.USER_ID, user.id).getSQL(), null);
resolver.insert(Filters.Users.CONTENT_URI, values);

View File

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

View File

@ -21,9 +21,13 @@ package org.mariotaku.twidere.activity.support;
import android.app.ActionBar;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.NavUtils;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.Menu;
import org.mariotaku.twidere.Constants;
@ -143,6 +147,20 @@ public abstract class BaseSupportThemedActivity extends FragmentActivity impleme
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
protected void onResume() {
super.onResume();

View File

@ -43,6 +43,7 @@ import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v4.util.LongSparseArray;
import android.text.Editable;
@ -53,7 +54,6 @@ import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
@ -78,6 +78,7 @@ import com.twitter.Extractor;
import org.mariotaku.dynamicgridview.DraggableArrayAdapter;
import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener;
import org.mariotaku.menucomponent.widget.PopupMenu;
import org.mariotaku.twidere.R;
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;
public class ComposeActivity extends BaseSupportDialogActivity implements TextWatcher, LocationListener,
OnMenuItemClickListener, OnClickListener, OnEditorActionListener, OnItemClickListener, OnItemLongClickListener,
MenuBarListener, OnClickListener, OnEditorActionListener, OnItemClickListener, OnItemLongClickListener,
OnLongClickListener {
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;
}
mBottomMenuBar.setIsBottomBar(true);
mBottomMenuBar.setOnMenuItemClickListener(this);
mActionMenuBar.setOnMenuItemClickListener(this);
mBottomMenuBar.setMenuBarListener(this);
mActionMenuBar.setMenuBarListener(this);
mEditText.setOnEditorActionListener(mPreferences.getBoolean(KEY_QUICK_SEND, false) ? this : null);
mEditText.addTextChangedListener(this);
mAccountSelectorAdapter = new AccountSelectorAdapter(this);
@ -1142,7 +1143,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
private void updateTextCount() {
final StatusTextCountView textCountView = mBottomSendButton ? mBottomSendTextCountView : mSendTextCountView;
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,
new String[]{FAKE_IMAGE_LINK}, textOrig) : textOrig + " " + FAKE_IMAGE_LINK : textOrig;
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
DialogInterface.OnClickListener {
@ -1167,6 +1173,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
}
@NonNull
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());
@ -1204,6 +1211,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
}
@NonNull
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Context wrapped = ThemeUtils.getDialogThemedContext(getActivity());

View File

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

View File

@ -120,6 +120,10 @@ public class LinkHandlerActivity extends BaseSupportActivity implements OnClickL
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setUiOptions(getWindow(), data);
super.onCreate(savedInstanceState);
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
setContentView(R.layout.layout_link_handler);
setProgressBarIndeterminateVisibility(false);
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) {
if (FlymeUtils.hasSmartBar()) {
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.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@ -35,7 +34,6 @@ import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
@ -116,7 +114,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
private SharedPreferences mPreferences;
private ContentResolver mResolver;
private AbstractSignInTask mTask;
private boolean mSameOAuthSigningUrl;
private boolean mSameOAuthSigningUrl, mNoVersionSuffix;
@Override
public void afterTextChanged(final Editable s) {
@ -136,6 +134,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
mAPIUrlFormat = data.getStringExtra(Accounts.API_URL_FORMAT);
mAuthType = data.getIntExtra(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH);
mSameOAuthSigningUrl = data.getBooleanExtra(Accounts.SAME_OAUTH_SIGNING_URL, false);
mNoVersionSuffix = data.getBooleanExtra(Accounts.NO_VERSION_SUFFIX, false);
mConsumerKey = data.getStringExtra(Accounts.CONSUMER_KEY);
mConsumerSecret = data.getStringExtra(Accounts.CONSUMER_SECRET);
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.AUTH_TYPE, mAuthType);
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_SECRET, mConsumerSecret);
startActivityForResult(intent, REQUEST_EDIT_API);
@ -305,6 +305,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
outState.putString(Accounts.API_URL_FORMAT, mAPIUrlFormat);
outState.putInt(Accounts.AUTH_TYPE, mAuthType);
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_SECRET, mConsumerSecret);
outState.putString(Accounts.SCREEN_NAME, mUsername);
@ -368,7 +369,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
setDefaultAPI();
final Configuration conf = getConfiguration();
mTask = new SignInTask(this, conf, mUsername, mPassword, mAuthType, mUserColor, mAPIUrlFormat,
mSameOAuthSigningUrl);
mSameOAuthSigningUrl, mNoVersionSuffix);
mTask.execute();
}
@ -384,7 +385,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
final String secret = intent.getStringExtra(EXTRA_REQUEST_TOKEN_SECRET);
final String verifier = intent.getStringExtra(EXTRA_OAUTH_VERIFIER);
mTask = new BrowserSignInTask(this, conf, token, secret, verifier, mUserColor, mAPIUrlFormat,
mSameOAuthSigningUrl);
mSameOAuthSigningUrl, mNoVersionSuffix);
mTask.execute();
}
@ -397,9 +398,10 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
cb.setHttpClientFactory(new TwidereHttpClientFactory(mApplication));
setUserAgent(this, cb);
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.setUploadBaseURL(Utils.getApiUrl(mAPIUrlFormat, "upload", "/1.1/"));
cb.setUploadBaseURL(Utils.getApiUrl(mAPIUrlFormat, "upload", versionSuffix));
if (!mSameOAuthSigningUrl) {
cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_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 int authType = mPreferences.getInt(KEY_AUTH_TYPE, Accounts.AUTH_TYPE_OAUTH);
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 consumerSecret = getNonEmptyString(mPreferences, KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET_2);
if (isEmpty(mAPIUrlFormat) || defaultApiChanged) {
@ -448,6 +451,9 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
if (defaultApiChanged) {
mSameOAuthSigningUrl = sameOAuthSigningUrl;
}
if (defaultApiChanged) {
mNoVersionSuffix = noVersionSuffix;
}
if (isEmpty(mConsumerKey) || defaultApiChanged) {
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.succeed) {
final ContentValues values;
switch (result.auth_type) {
case Accounts.AUTH_TYPE_BASIC: {
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;
}
case Accounts.AUTH_TYPE_TWIP_O_MODE: {
values = makeAccountContentValuesTWIP(result.conf, result.user, result.color,
result.api_url_format);
result.api_url_format, result.no_version_suffix);
break;
}
case Accounts.AUTH_TYPE_OAUTH:
case Accounts.AUTH_TYPE_XAUTH: {
values = makeAccountContentValuesOAuth(result.conf, result.access_token, result.user,
result.auth_type, result.color, result.api_url_format, result.same_oauth_signing_url);
values = makeAccountContentValuesOAuth(result.conf, result.access_token,
result.user, result.auth_type, result.color, result.api_url_format,
result.same_oauth_signing_url, result.no_version_suffix);
break;
}
default: {
@ -540,7 +548,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
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 SignInActivity callback;
@ -551,7 +559,7 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
}
@Override
protected void onPostExecute(final SigninResponse result) {
protected void onPostExecute(final SignInResponse result) {
if (callback != null) {
callback.onSignInResult(result);
}
@ -597,11 +605,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
private final Context context;
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,
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);
this.context = context;
this.conf = conf;
@ -611,23 +619,24 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
this.user_color = user_color;
this.api_url_format = api_url_format;
this.same_oauth_signing_url = same_oauth_signing_url;
this.no_version_suffix = no_version_suffix;
}
@Override
protected SigninResponse doInBackground(final Void... params) {
protected SignInResponse doInBackground(final Void... params) {
try {
final Twitter twitter = new TwitterFactory(conf).getInstance();
final AccessToken access_token = twitter.getOAuthAccessToken(new RequestToken(conf, request_token,
request_token_secret), oauth_verifier);
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();
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);
return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, api_url_format,
same_oauth_signing_url);
return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color,
api_url_format, same_oauth_signing_url, no_version_suffix);
} 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 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,
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);
this.context = context;
this.conf = conf;
@ -669,10 +678,11 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
this.user_color = user_color;
this.api_url_format = api_url_format;
this.same_oauth_signing_url = same_oauth_signing_url;
this.no_version_suffix = no_version_suffix;
}
@Override
protected SigninResponse doInBackground(final Void... params) {
protected SignInResponse doInBackground(final Void... params) {
try {
switch (auth_type) {
case Accounts.AUTH_TYPE_OAUTH:
@ -687,67 +697,73 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
return authOAuth();
} catch (final TwitterException e) {
e.printStackTrace();
return new SigninResponse(false, false, e);
return new SignInResponse(false, false, e);
} catch (final AuthenticationException e) {
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 User user = twitter.verifyCredentials();
final long user_id = user.getId();
if (user_id <= 0) return new SigninResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null);
if (user_id <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
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 OAuthPasswordAuthenticator authenticator = new OAuthPasswordAuthenticator(twitter);
final AccessToken access_token = authenticator.getOAuthAccessToken(username, password);
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();
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);
return new SigninResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color, api_url_format,
same_oauth_signing_url);
return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_OAUTH, color,
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 User user = twitter.verifyCredentials();
final long user_id = user.getId();
if (user_id <= 0) return new SigninResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null);
if (user_id <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
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 AccessToken access_token = twitter.getOAuthAccessToken(username, password);
final User user = twitter.verifyCredentials();
final long user_id = user.getId();
if (user_id <= 0) return new SigninResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SigninResponse(true, false, null);
if (user_id <= 0) return new SignInResponse(false, false, null);
if (isUserLoggedIn(context, user_id)) return new SignInResponse(true, false, null);
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,
same_oauth_signing_url);
return new SignInResponse(conf, access_token, user, Accounts.AUTH_TYPE_XAUTH, color,
api_url_format, same_oauth_signing_url, no_version_suffix);
}
}
@Override
public int getThemeResourceId() {
return ThemeUtils.getSettingsThemeResource(this);
}
static interface SigninCallback {
void onSigninResult(SigninResponse response);
void onSigninResult(SignInResponse response);
void onSigninStart();
}
static class SigninResponse {
static class SignInResponse {
public final boolean already_logged_in, succeed;
public final Exception exception;
@ -757,16 +773,16 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
public final User user;
public final int auth_type, color;
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) {
this(already_logged_in, succeed, exception, null, null, null, null, null, 0, 0, null, false);
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, 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 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.succeed = succeed;
this.exception = exception;
@ -779,23 +795,27 @@ public class SignInActivity extends BaseSupportActivity implements TwitterConsta
this.color = color;
this.api_url_format = api_url_format;
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,
final int auth_type, final int color, final String api_url_format, final boolean same_oauth_signing_url) {
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 boolean no_version_suffix) {
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,
final User user, final int color, final String api_url_format) {
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 boolean no_version_suffix) {
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,
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";
@Preference(type = BOOLEAN, hasDefault = true, defaultBoolean = false)
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)
public static final String KEY_AUTH_TYPE = "auth_type";
@Preference(type = STRING, hasDefault = true, defaultString = TwidereConstants.TWITTER_CONSUMER_KEY_2)

View File

@ -19,7 +19,7 @@
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.content.ContentResolverUtils.bulkDelete;
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.ParcelableUserMention;
import org.mariotaku.twidere.provider.TweetStore.Filters;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.HtmlEscapeHelper;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils;
@ -71,11 +72,11 @@ public class AddStatusFilterDialogFragment extends BaseSupportDialogFragment imp
if (value instanceof ParcelableUserMention) {
final ParcelableUserMention mention = (ParcelableUserMention) value;
user_ids.add(mention.id);
user_values.add(makeFilterdUserContentValues(mention));
user_values.add(makeFilteredUserContentValues(mention));
} else if (value instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) value;
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) {
if (value != null) {
final String keyword = ParseUtils.parseString(value);

View File

@ -65,7 +65,6 @@ import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.refreshnow.widget.RefreshMode;
import org.mariotaku.twidere.R;
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.ExtendedFrameLayout;
import org.mariotaku.twidere.view.StatusTextView;
import org.mariotaku.twidere.view.TwidereMenuBar;
import java.io.IOException;
import java.util.ArrayList;
@ -156,7 +156,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
private boolean mFollowInfoDisplayed, mLocationInfoDisplayed;
private boolean mStatusLoaderInitialized, mLocationLoaderInitialized;
private boolean mFollowInfoLoaderInitialized;
;
private boolean mShouldScroll;
private SharedPreferences mPreferences;
private AsyncTwitterWrapper mTwitterWrapper;
@ -171,7 +171,7 @@ public class StatusFragment extends ParcelableStatusesListFragment implements On
private Button mRetryButton;
private View mMainContent, mFollowIndicator, mImagePreviewContainer, mLocationContainer, mLocationBackgroundView;
private ColorLabelRelativeLayout mProfileView;
private MenuBar mMenuBar;
private TwidereMenuBar mMenuBar;
private ProgressBar mDetailsLoadProgress, mFollowInfoProgress;
private LinearLayout mImagePreviewGrid;
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);
mMainContent = view.findViewById(R.id.content);
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.addView(super.onCreateView(inflater, container, savedInstanceState));
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.Filters;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.FlymeUtils;
import org.mariotaku.twidere.util.ImageLoaderWrapper;
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.ExtendedFrameLayout;
import org.mariotaku.twidere.view.ProfileImageView;
import org.mariotaku.twidere.view.TwidereMenuBar;
import org.mariotaku.twidere.view.iface.IExtendedView.OnSizeChangedListener;
import java.util.Locale;
@ -101,7 +103,6 @@ import twitter4j.Twitter;
import twitter4j.TwitterException;
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.UserColorNicknameUtils.clearUserColor;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.clearUserNickname;
@ -161,7 +162,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl
private View mMainContent;
private View mProfileBannerSpace;
private ProgressBar mDetailsLoadProgress;
private MenuBar mMenuBar;
private TwidereMenuBar mMenuBar;
private ListActionAdapter mAdapter;
@ -720,7 +721,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl
super.onViewCreated(view, savedInstanceState);
mMainContent = view.findViewById(R.id.content);
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);
mRetryButton = (Button) view.findViewById(R.id.retry);
mErrorMessageView = (TextView) view.findViewById(R.id.error_message);
@ -792,7 +793,7 @@ public class UserProfileFragment extends BaseSupportListFragment implements OnCl
case MENU_ADD_TO_FILTER: {
final ContentResolver resolver = getContentResolver();
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);
break;
}

View File

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

View File

@ -19,8 +19,6 @@
package org.mariotaku.twidere.util;
import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
import android.content.ContentValues;
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.Statuses;
import java.util.ArrayList;
import java.util.List;
import twitter4j.DirectMessage;
import twitter4j.GeoLocation;
import twitter4j.Status;
@ -54,302 +55,305 @@ import twitter4j.User;
import twitter4j.auth.AccessToken;
import twitter4j.conf.Configuration;
import java.util.ArrayList;
import java.util.List;
import static org.mariotaku.twidere.util.HtmlEscapeHelper.toPlainText;
public final class ContentValuesCreator implements TwidereConstants {
public static ContentValues makeAccountContentValuesBasic(final Configuration conf, final String basicUsername,
final String basicPassword, final User user, final int color, final String apiUrlFormat) {
if (user == null || user.getId() <= 0) return null;
final ContentValues values = new ContentValues();
if (basicUsername == null || basicPassword == null) return null;
values.put(Accounts.BASIC_AUTH_USERNAME, basicUsername);
values.put(Accounts.BASIC_AUTH_PASSWORD, basicPassword);
values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_BASIC);
values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
return values;
}
public static ContentValues makeAccountContentValuesBasic(final Configuration conf, final String basicUsername,
final String basicPassword, final User user, final int color, final String apiUrlFormat,
final boolean noVersionSuffix) {
if (user == null || user.getId() <= 0) return null;
final ContentValues values = new ContentValues();
if (basicUsername == null || basicPassword == null) return null;
values.put(Accounts.BASIC_AUTH_USERNAME, basicUsername);
values.put(Accounts.BASIC_AUTH_PASSWORD, basicPassword);
values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_BASIC);
values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1);
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,
final User user, final int authType, final int color, final String apiUrlFormat,
final boolean sameOAuthSigningUrl) {
if (user == null || user.getId() <= 0 || accessToken == null || user.getId() != accessToken.getUserId())
return null;
final ContentValues values = new ContentValues();
values.put(Accounts.OAUTH_TOKEN, accessToken.getToken());
values.put(Accounts.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret());
values.put(Accounts.CONSUMER_KEY, conf.getOAuthConsumerKey());
values.put(Accounts.CONSUMER_SECRET, conf.getOAuthConsumerSecret());
values.put(Accounts.AUTH_TYPE, authType);
values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
values.put(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl);
return values;
}
public static ContentValues makeAccountContentValuesOAuth(final Configuration conf, final AccessToken accessToken,
final User user, final int authType, final int color, final String apiUrlFormat,
final boolean sameOAuthSigningUrl, final boolean noVersionSuffix) {
if (user == null || user.getId() <= 0 || accessToken == null || user.getId() != accessToken.getUserId())
return null;
final ContentValues values = new ContentValues();
values.put(Accounts.OAUTH_TOKEN, accessToken.getToken());
values.put(Accounts.OAUTH_TOKEN_SECRET, accessToken.getTokenSecret());
values.put(Accounts.CONSUMER_KEY, conf.getOAuthConsumerKey());
values.put(Accounts.CONSUMER_SECRET, conf.getOAuthConsumerSecret());
values.put(Accounts.AUTH_TYPE, authType);
values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
values.put(Accounts.SAME_OAUTH_SIGNING_URL, sameOAuthSigningUrl);
values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
return values;
}
public static ContentValues makeAccountContentValuesTWIP(final Configuration conf, final User user,
final int color, final String apiUrlFormat) {
if (user == null || user.getId() <= 0) return null;
final ContentValues values = new ContentValues();
values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_TWIP_O_MODE);
values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
return values;
}
public static ContentValues makeAccountContentValuesTWIP(final Configuration conf, final User user,
final int color, final String apiUrlFormat, final boolean noVersionSuffix) {
if (user == null || user.getId() <= 0) return null;
final ContentValues values = new ContentValues();
values.put(Accounts.AUTH_TYPE, Accounts.AUTH_TYPE_TWIP_O_MODE);
values.put(Accounts.ACCOUNT_ID, user.getId());
values.put(Accounts.SCREEN_NAME, user.getScreenName());
values.put(Accounts.NAME, user.getName());
values.put(Accounts.PROFILE_IMAGE_URL, ParseUtils.parseString(user.getProfileImageUrlHttps()));
values.put(Accounts.PROFILE_BANNER_URL, ParseUtils.parseString(user.getProfileBannerImageUrl()));
values.put(Accounts.COLOR, color);
values.put(Accounts.IS_ACTIVATED, 1);
values.put(Accounts.API_URL_FORMAT, apiUrlFormat);
values.put(Accounts.NO_VERSION_SUFFIX, noVersionSuffix);
return values;
}
public static ContentValues makeCachedUserContentValues(final User user) {
if (user == null || user.getId() <= 0) return null;
final String profile_image_url = ParseUtils.parseString(user.getProfileImageUrlHttps());
final String url = ParseUtils.parseString(user.getURL());
final URLEntity[] urls = user.getURLEntities();
final ContentValues values = new ContentValues();
values.put(CachedUsers.USER_ID, user.getId());
values.put(CachedUsers.NAME, user.getName());
values.put(CachedUsers.SCREEN_NAME, user.getScreenName());
values.put(CachedUsers.PROFILE_IMAGE_URL, profile_image_url);
values.put(CachedUsers.CREATED_AT, user.getCreatedAt().getTime());
values.put(CachedUsers.IS_PROTECTED, user.isProtected());
values.put(CachedUsers.IS_VERIFIED, user.isVerified());
values.put(CachedUsers.IS_FOLLOWING, user.isFollowing());
values.put(CachedUsers.FAVORITES_COUNT, user.getFavouritesCount());
values.put(CachedUsers.FOLLOWERS_COUNT, user.getFollowersCount());
values.put(CachedUsers.FRIENDS_COUNT, user.getFriendsCount());
values.put(CachedUsers.STATUSES_COUNT, user.getStatusesCount());
values.put(CachedUsers.LOCATION, user.getLocation());
values.put(CachedUsers.DESCRIPTION_PLAIN, user.getDescription());
values.put(CachedUsers.DESCRIPTION_HTML, Utils.formatUserDescription(user));
values.put(CachedUsers.DESCRIPTION_EXPANDED, Utils.formatExpandedUserDescription(user));
values.put(CachedUsers.URL, url);
values.put(CachedUsers.URL_EXPANDED,
url != null && urls != null && urls.length > 0 ? ParseUtils.parseString(urls[0].getExpandedURL())
: null);
values.put(CachedUsers.PROFILE_BANNER_URL, user.getProfileBannerImageUrl());
return values;
}
public static ContentValues makeCachedUserContentValues(final User user) {
if (user == null || user.getId() <= 0) return null;
final String profile_image_url = ParseUtils.parseString(user.getProfileImageUrlHttps());
final String url = ParseUtils.parseString(user.getURL());
final URLEntity[] urls = user.getURLEntities();
final ContentValues values = new ContentValues();
values.put(CachedUsers.USER_ID, user.getId());
values.put(CachedUsers.NAME, user.getName());
values.put(CachedUsers.SCREEN_NAME, user.getScreenName());
values.put(CachedUsers.PROFILE_IMAGE_URL, profile_image_url);
values.put(CachedUsers.CREATED_AT, user.getCreatedAt().getTime());
values.put(CachedUsers.IS_PROTECTED, user.isProtected());
values.put(CachedUsers.IS_VERIFIED, user.isVerified());
values.put(CachedUsers.IS_FOLLOWING, user.isFollowing());
values.put(CachedUsers.FAVORITES_COUNT, user.getFavouritesCount());
values.put(CachedUsers.FOLLOWERS_COUNT, user.getFollowersCount());
values.put(CachedUsers.FRIENDS_COUNT, user.getFriendsCount());
values.put(CachedUsers.STATUSES_COUNT, user.getStatusesCount());
values.put(CachedUsers.LOCATION, user.getLocation());
values.put(CachedUsers.DESCRIPTION_PLAIN, user.getDescription());
values.put(CachedUsers.DESCRIPTION_HTML, Utils.formatUserDescription(user));
values.put(CachedUsers.DESCRIPTION_EXPANDED, Utils.formatExpandedUserDescription(user));
values.put(CachedUsers.URL, url);
values.put(CachedUsers.URL_EXPANDED,
url != null && urls != null && urls.length > 0 ? ParseUtils.parseString(urls[0].getExpandedURL())
: null);
values.put(CachedUsers.PROFILE_BANNER_URL, user.getProfileBannerImageUrl());
return values;
}
public static ContentValues makeDirectMessageContentValues(final DirectMessage message, final long account_id,
final boolean is_outgoing) {
if (message == null || message.getId() <= 0) return null;
final ContentValues values = new ContentValues();
final User sender = message.getSender(), recipient = message.getRecipient();
if (sender == null || recipient == null) return null;
final String sender_profile_image_url = ParseUtils.parseString(sender.getProfileImageUrlHttps());
final String recipient_profile_image_url = ParseUtils.parseString(recipient.getProfileImageUrlHttps());
values.put(DirectMessages.ACCOUNT_ID, account_id);
values.put(DirectMessages.MESSAGE_ID, message.getId());
values.put(DirectMessages.MESSAGE_TIMESTAMP, message.getCreatedAt().getTime());
values.put(DirectMessages.SENDER_ID, sender.getId());
values.put(DirectMessages.RECIPIENT_ID, recipient.getId());
final String text_html = Utils.formatDirectMessageText(message);
values.put(DirectMessages.TEXT_HTML, text_html);
values.put(DirectMessages.TEXT_PLAIN, message.getText());
values.put(DirectMessages.TEXT_UNESCAPED, toPlainText(text_html));
values.put(DirectMessages.IS_OUTGOING, is_outgoing);
values.put(DirectMessages.SENDER_NAME, sender.getName());
values.put(DirectMessages.SENDER_SCREEN_NAME, sender.getScreenName());
values.put(DirectMessages.RECIPIENT_NAME, recipient.getName());
values.put(DirectMessages.RECIPIENT_SCREEN_NAME, recipient.getScreenName());
values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, sender_profile_image_url);
values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url);
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(message);
if (medias != null) {
values.put(DirectMessages.MEDIAS, JSONSerializer.toJSONArrayString(medias));
values.put(DirectMessages.FIRST_MEDIA, medias[0].url);
}
return values;
}
public static ContentValues makeDirectMessageContentValues(final DirectMessage message, final long account_id,
final boolean is_outgoing) {
if (message == null || message.getId() <= 0) return null;
final ContentValues values = new ContentValues();
final User sender = message.getSender(), recipient = message.getRecipient();
if (sender == null || recipient == null) return null;
final String sender_profile_image_url = ParseUtils.parseString(sender.getProfileImageUrlHttps());
final String recipient_profile_image_url = ParseUtils.parseString(recipient.getProfileImageUrlHttps());
values.put(DirectMessages.ACCOUNT_ID, account_id);
values.put(DirectMessages.MESSAGE_ID, message.getId());
values.put(DirectMessages.MESSAGE_TIMESTAMP, message.getCreatedAt().getTime());
values.put(DirectMessages.SENDER_ID, sender.getId());
values.put(DirectMessages.RECIPIENT_ID, recipient.getId());
final String text_html = Utils.formatDirectMessageText(message);
values.put(DirectMessages.TEXT_HTML, text_html);
values.put(DirectMessages.TEXT_PLAIN, message.getText());
values.put(DirectMessages.TEXT_UNESCAPED, toPlainText(text_html));
values.put(DirectMessages.IS_OUTGOING, is_outgoing);
values.put(DirectMessages.SENDER_NAME, sender.getName());
values.put(DirectMessages.SENDER_SCREEN_NAME, sender.getScreenName());
values.put(DirectMessages.RECIPIENT_NAME, recipient.getName());
values.put(DirectMessages.RECIPIENT_SCREEN_NAME, recipient.getScreenName());
values.put(DirectMessages.SENDER_PROFILE_IMAGE_URL, sender_profile_image_url);
values.put(DirectMessages.RECIPIENT_PROFILE_IMAGE_URL, recipient_profile_image_url);
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(message);
if (medias != null) {
values.put(DirectMessages.MEDIAS, JSONSerializer.toJSONArrayString(medias));
values.put(DirectMessages.FIRST_MEDIA, medias[0].url);
}
return values;
}
public static ContentValues makeDirectMessageContentValues(final ParcelableDirectMessage message) {
if (message == null || message.id <= 0) return null;
final ContentValues values = new ContentValues();
values.put(DirectMessages.ACCOUNT_ID, message.account_id);
values.put(DirectMessages.MESSAGE_ID, message.id);
values.put(DirectMessages.MESSAGE_TIMESTAMP, message.timestamp);
values.put(DirectMessages.SENDER_ID, message.sender_id);
values.put(DirectMessages.RECIPIENT_ID, message.recipient_id);
values.put(DirectMessages.TEXT_HTML, message.text_html);
values.put(DirectMessages.TEXT_PLAIN, message.text_plain);
values.put(DirectMessages.IS_OUTGOING, message.is_outgoing);
values.put(DirectMessages.SENDER_NAME, message.sender_name);
values.put(DirectMessages.SENDER_SCREEN_NAME, message.sender_screen_name);
values.put(DirectMessages.RECIPIENT_NAME, message.recipient_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.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url);
if (message.medias != null) {
values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(message.medias));
values.put(Statuses.FIRST_MEDIA, message.medias[0].url);
}
return values;
}
public static ContentValues makeDirectMessageContentValues(final ParcelableDirectMessage message) {
if (message == null || message.id <= 0) return null;
final ContentValues values = new ContentValues();
values.put(DirectMessages.ACCOUNT_ID, message.account_id);
values.put(DirectMessages.MESSAGE_ID, message.id);
values.put(DirectMessages.MESSAGE_TIMESTAMP, message.timestamp);
values.put(DirectMessages.SENDER_ID, message.sender_id);
values.put(DirectMessages.RECIPIENT_ID, message.recipient_id);
values.put(DirectMessages.TEXT_HTML, message.text_html);
values.put(DirectMessages.TEXT_PLAIN, message.text_plain);
values.put(DirectMessages.IS_OUTGOING, message.is_outgoing);
values.put(DirectMessages.SENDER_NAME, message.sender_name);
values.put(DirectMessages.SENDER_SCREEN_NAME, message.sender_screen_name);
values.put(DirectMessages.RECIPIENT_NAME, message.recipient_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.RECIPIENT_PROFILE_IMAGE_URL, message.recipient_profile_image_url);
if (message.medias != null) {
values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(message.medias));
values.put(Statuses.FIRST_MEDIA, message.medias[0].url);
}
return values;
}
public static ContentValues makeDirectMessageDraftContentValues(final long accountId, final long recipientId,
final String text, final String imageUri) {
final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Drafts.ACTION_SEND_DIRECT_MESSAGE);
values.put(Drafts.TEXT, text);
values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(new long[] { accountId }, ',', false));
values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (imageUri != null) {
final ParcelableMediaUpdate[] medias = { new ParcelableMediaUpdate(imageUri, 0) };
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias));
}
final JSONObject extras = new JSONObject();
try {
extras.put(EXTRA_RECIPIENT_ID, recipientId);
} catch (final JSONException e) {
e.printStackTrace();
}
values.put(Drafts.ACTION_EXTRAS, extras.toString());
return values;
}
public static ContentValues makeDirectMessageDraftContentValues(final long accountId, final long recipientId,
final String text, final String imageUri) {
final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Drafts.ACTION_SEND_DIRECT_MESSAGE);
values.put(Drafts.TEXT, text);
values.put(Drafts.ACCOUNT_IDS, ArrayUtils.toString(new long[]{accountId}, ',', false));
values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (imageUri != null) {
final ParcelableMediaUpdate[] medias = {new ParcelableMediaUpdate(imageUri, 0)};
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias));
}
final JSONObject extras = new JSONObject();
try {
extras.put(EXTRA_RECIPIENT_ID, recipientId);
} catch (final JSONException e) {
e.printStackTrace();
}
values.put(Drafts.ACTION_EXTRAS, extras.toString());
return values;
}
public static ContentValues makeFilterdUserContentValues(final ParcelableStatus status) {
if (status == null) return null;
final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, status.user_id);
values.put(Filters.Users.NAME, status.user_name);
values.put(Filters.Users.SCREEN_NAME, status.user_screen_name);
return values;
}
public static ContentValues makeFilteredUserContentValues(final ParcelableStatus status) {
if (status == null) return null;
final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, status.user_id);
values.put(Filters.Users.NAME, status.user_name);
values.put(Filters.Users.SCREEN_NAME, status.user_screen_name);
return values;
}
public static ContentValues makeFilterdUserContentValues(final ParcelableUser user) {
if (user == null) return null;
final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, user.id);
values.put(Filters.Users.NAME, user.name);
values.put(Filters.Users.SCREEN_NAME, user.screen_name);
return values;
}
public static ContentValues makeFilteredUserContentValues(final ParcelableUser user) {
if (user == null) return null;
final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, user.id);
values.put(Filters.Users.NAME, user.name);
values.put(Filters.Users.SCREEN_NAME, user.screen_name);
return values;
}
public static ContentValues makeFilterdUserContentValues(final ParcelableUserMention user) {
if (user == null) return null;
final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, user.id);
values.put(Filters.Users.NAME, user.name);
values.put(Filters.Users.SCREEN_NAME, user.screen_name);
return values;
}
public static ContentValues makeFilteredUserContentValues(final ParcelableUserMention user) {
if (user == null) return null;
final ContentValues values = new ContentValues();
values.put(Filters.Users.USER_ID, user.id);
values.put(Filters.Users.NAME, user.name);
values.put(Filters.Users.SCREEN_NAME, user.screen_name);
return values;
}
public static ContentValues makeStatusContentValues(final Status orig, final long account_id) {
if (orig == null || orig.getId() <= 0) return null;
final ContentValues values = new ContentValues();
values.put(Statuses.ACCOUNT_ID, account_id);
values.put(Statuses.STATUS_ID, orig.getId());
values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime());
values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet());
final boolean is_retweet = orig.isRetweet();
final Status status;
final Status retweeted_status = is_retweet ? orig.getRetweetedStatus() : null;
if (retweeted_status != null) {
final User retweet_user = orig.getUser();
values.put(Statuses.RETWEET_ID, retweeted_status.getId());
values.put(Statuses.RETWEET_TIMESTAMP, retweeted_status.getCreatedAt().getTime());
values.put(Statuses.RETWEETED_BY_USER_ID, retweet_user.getId());
values.put(Statuses.RETWEETED_BY_USER_NAME, retweet_user.getName());
values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweet_user.getScreenName());
status = retweeted_status;
} else {
status = orig;
}
final User user = status.getUser();
if (user != null) {
final long userId = user.getId();
final String profileImageUrl = ParseUtils.parseString(user.getProfileImageUrlHttps());
final String name = user.getName(), screenName = user.getScreenName();
values.put(Statuses.USER_ID, userId);
values.put(Statuses.USER_NAME, name);
values.put(Statuses.USER_SCREEN_NAME, screenName);
values.put(Statuses.IS_PROTECTED, user.isProtected());
values.put(Statuses.IS_VERIFIED, user.isVerified());
values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl);
values.put(CachedUsers.IS_FOLLOWING, user.isFollowing());
}
final String text_html = Utils.formatStatusText(status);
values.put(Statuses.TEXT_HTML, text_html);
values.put(Statuses.TEXT_PLAIN, status.getText());
values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html));
values.put(Statuses.RETWEET_COUNT, status.getRetweetCount());
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_NAME, Utils.getInReplyToName(status));
values.put(Statuses.IN_REPLY_TO_USER_SCREEN_NAME, status.getInReplyToScreenName());
values.put(Statuses.SOURCE, status.getSource());
values.put(Statuses.IS_POSSIBLY_SENSITIVE, status.isPossiblySensitive());
final GeoLocation location = status.getGeoLocation();
if (location != null) {
values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude());
}
values.put(Statuses.IS_RETWEET, is_retweet);
values.put(Statuses.IS_FAVORITE, status.isFavorited());
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status);
if (medias != null) {
values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(medias));
values.put(Statuses.FIRST_MEDIA, medias[0].url);
}
final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status);
if (mentions != null) {
values.put(Statuses.MENTIONS, JSONSerializer.toJSONArrayString(mentions));
}
return values;
}
public static ContentValues makeStatusContentValues(final Status orig, final long account_id) {
if (orig == null || orig.getId() <= 0) return null;
final ContentValues values = new ContentValues();
values.put(Statuses.ACCOUNT_ID, account_id);
values.put(Statuses.STATUS_ID, orig.getId());
values.put(Statuses.STATUS_TIMESTAMP, orig.getCreatedAt().getTime());
values.put(Statuses.MY_RETWEET_ID, orig.getCurrentUserRetweet());
final boolean isRetweet = orig.isRetweet();
final Status status;
final Status retweetedStatus = isRetweet ? orig.getRetweetedStatus() : null;
if (retweetedStatus != null) {
final User retweetUser = orig.getUser();
values.put(Statuses.RETWEET_ID, retweetedStatus.getId());
values.put(Statuses.RETWEET_TIMESTAMP, retweetedStatus.getCreatedAt().getTime());
values.put(Statuses.RETWEETED_BY_USER_ID, retweetUser.getId());
values.put(Statuses.RETWEETED_BY_USER_NAME, retweetUser.getName());
values.put(Statuses.RETWEETED_BY_USER_SCREEN_NAME, retweetUser.getScreenName());
status = retweetedStatus;
} else {
status = orig;
}
final User user = status.getUser();
if (user != null) {
final long userId = user.getId();
final String profileImageUrl = ParseUtils.parseString(user.getProfileImageUrlHttps());
final String name = user.getName(), screenName = user.getScreenName();
values.put(Statuses.USER_ID, userId);
values.put(Statuses.USER_NAME, name);
values.put(Statuses.USER_SCREEN_NAME, screenName);
values.put(Statuses.IS_PROTECTED, user.isProtected());
values.put(Statuses.IS_VERIFIED, user.isVerified());
values.put(Statuses.USER_PROFILE_IMAGE_URL, profileImageUrl);
values.put(CachedUsers.IS_FOLLOWING, user.isFollowing());
}
final String text_html = Utils.formatStatusText(status);
values.put(Statuses.TEXT_HTML, text_html);
values.put(Statuses.TEXT_PLAIN, status.getText());
values.put(Statuses.TEXT_UNESCAPED, toPlainText(text_html));
values.put(Statuses.RETWEET_COUNT, status.getRetweetCount());
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_NAME, Utils.getInReplyToName(status));
values.put(Statuses.IN_REPLY_TO_USER_SCREEN_NAME, status.getInReplyToScreenName());
values.put(Statuses.SOURCE, status.getSource());
values.put(Statuses.IS_POSSIBLY_SENSITIVE, status.isPossiblySensitive());
final GeoLocation location = status.getGeoLocation();
if (location != null) {
values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude());
}
values.put(Statuses.IS_RETWEET, isRetweet);
values.put(Statuses.IS_FAVORITE, status.isFavorited());
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status);
if (medias != null) {
values.put(Statuses.MEDIAS, JSONSerializer.toJSONArrayString(medias));
values.put(Statuses.FIRST_MEDIA, medias[0].url);
}
final ParcelableUserMention[] mentions = ParcelableUserMention.fromStatus(status);
if (mentions != null) {
values.put(Statuses.MENTIONS, JSONSerializer.toJSONArrayString(mentions));
}
return values;
}
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) {
return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts));
}
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status) {
return makeStatusDraftContentValues(status, Account.getAccountIds(status.accounts));
}
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status,
final long[] accountIds) {
final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Drafts.ACTION_UPDATE_STATUS);
values.put(Drafts.TEXT, status.text);
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.LOCATION, ParcelableLocation.toString(status.location));
values.put(Drafts.IS_POSSIBLY_SENSITIVE, status.is_possibly_sensitive);
values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (status.medias != null) {
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(status.medias));
}
return values;
}
public static ContentValues makeStatusDraftContentValues(final ParcelableStatusUpdate status,
final long[] accountIds) {
final ContentValues values = new ContentValues();
values.put(Drafts.ACTION_TYPE, Drafts.ACTION_UPDATE_STATUS);
values.put(Drafts.TEXT, status.text);
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.LOCATION, ParcelableLocation.toString(status.location));
values.put(Drafts.IS_POSSIBLY_SENSITIVE, status.is_possibly_sensitive);
values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (status.medias != null) {
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(status.medias));
}
return values;
}
public static ContentValues[] makeTrendsContentValues(final List<Trends> trends_list) {
if (trends_list == null) return new ContentValues[0];
final List<ContentValues> result_list = new ArrayList<ContentValues>();
for (final Trends trends : trends_list) {
if (trends == null) {
continue;
}
final long timestamp = trends.getTrendAt().getTime();
for (final Trend trend : trends.getTrends()) {
final ContentValues values = new ContentValues();
values.put(CachedTrends.NAME, trend.getName());
values.put(CachedTrends.TIMESTAMP, timestamp);
result_list.add(values);
}
}
return result_list.toArray(new ContentValues[result_list.size()]);
}
public static ContentValues[] makeTrendsContentValues(final List<Trends> trendsList) {
if (trendsList == null) return new ContentValues[0];
final List<ContentValues> resultList = new ArrayList<>();
for (final Trends trends : trendsList) {
if (trends == null) {
continue;
}
final long timestamp = trends.getTrendAt().getTime();
for (final Trend trend : trends.getTrends()) {
final ContentValues values = new ContentValues();
values.put(CachedTrends.NAME, trend.getName());
values.put(CachedTrends.TIMESTAMP, timestamp);
resultList.add(values);
}
}
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.CroutonStyle;
import static org.mariotaku.twidere.util.ContentValuesCreator.makeFilterdUserContentValues;
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.bulkInsert;
@ -145,11 +144,11 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
userIds.add(status.user_id);
valuesList.add(makeFilterdUserContentValues(status));
valuesList.add(ContentValuesCreator.makeFilteredUserContentValues(status));
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
userIds.add(user.id);
valuesList.add(makeFilterdUserContentValues(user));
valuesList.add(ContentValuesCreator.makeFilteredUserContentValues(user));
} else {
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.TextUtils;
import android.util.AttributeSet;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarMenuInfo;
import org.mariotaku.refreshnow.widget.RefreshNowConfig;
import org.mariotaku.refreshnow.widget.RefreshNowProgressIndicator.IndicatorConfig;
import org.mariotaku.twidere.Constants;
@ -114,6 +118,25 @@ public class ThemeUtils implements Constants {
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) {
final IndicatorConfig.Builder builder = new IndicatorConfig.Builder(context);
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) {
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);
if (urlBase.endsWith("/")) {
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 ConfigurationBuilder cb = new ConfigurationBuilder();
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.setUploadBaseURL(getApiUrl(account.api_url_format, "upload", "/1.1/"));
cb.setUploadBaseURL(getApiUrl(account.api_url_format, "upload", versionSuffix));
if (!account.same_oauth_signing_url) {
cb.setSigningRestBaseURL(DEFAULT_SIGNING_REST_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 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;
try {
if (!c.moveToFirst()) return null;
@ -2416,7 +2418,7 @@ public final class Utils implements Constants, TwitterConstants {
// versions
final String where = Where.equals(new Column(Accounts.ACCOUNT_ID), accountId).getSQL();
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;
try {
if (!c.moveToFirst()) return null;
@ -2793,22 +2795,22 @@ public final class Utils implements Constants, TwitterConstants {
// SCREENLAYOUT_LAYOUTDIR_RTL;
}
public static boolean isSameAccount(final Context context, final long account_id, final long user_id) {
if (context == null || account_id <= 0 || user_id <= 0) return false;
return account_id == user_id;
public static boolean isSameAccount(final Context context, final long accountId, final long userId) {
if (context == null || accountId <= 0 || userId <= 0) return false;
return accountId == userId;
}
public static boolean isSameAccount(final Context context, final long account_id, final String screen_name) {
if (context == null || account_id <= 0 || screen_name == null) return false;
return screen_name.equalsIgnoreCase(getAccountScreenName(context, account_id));
public static boolean isSameAccount(final Context context, final long accountId, final String screenName) {
if (context == null || accountId <= 0 || screenName == null) return false;
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;
final long[] ids = getAccountIds(context);
if (ids == null) return false;
for (final long id : ids) {
if (id == account_id) return true;
if (id == accountId) return true;
}
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,
EXTRA_STATUS, EXTRA_STATUS_JSON, status);
final MenuItem shareItem = menu.findItem(R.id.share_submenu);
final Menu shareSubmenu = shareItem != null && shareItem.hasSubMenu() ? shareItem.getSubMenu() : null;
if (shareSubmenu != null) {
final Menu shareSubMenu = shareItem != null && shareItem.hasSubMenu() ? shareItem.getSubMenu() : null;
if (shareSubMenu != null) {
final Intent shareIntent = createStatusShareIntent(context, status);
shareSubmenu.removeGroup(MENU_GROUP_STATUS_SHARE);
addIntentToMenu(context, shareSubmenu, shareIntent, MENU_GROUP_STATUS_SHARE);
shareSubMenu.removeGroup(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) {
if (info == null || info.activityInfo == null) return true;
if (info == null || info.activityInfo == null) return false;
final ActivityInfo activityInfo = info.activityInfo;
if (activityInfo.metaData != null && activityInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON))
return activityInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON);
final ApplicationInfo appInfo = activityInfo.applicationInfo;
if (appInfo == null) return true;
if (appInfo.metaData != null && appInfo.metaData.containsKey(METADATA_KEY_EXTENSION_USE_JSON))
return appInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON);
return true;
if (appInfo == null) return false;
return appInfo.metaData != null && appInfo.metaData.getBoolean(METADATA_KEY_EXTENSION_USE_JSON, false);
}
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
*
* @param color
* @param color Input color, alpha channel will be disposed.
* @return {@link Color#WHITE} or {@link Color#BLACK}
* @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;
import android.content.Context;
import android.graphics.PorterDuff.Mode;
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.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.
*/
public class TwidereMenuBar extends MenuBar {
public class TwidereMenuBar extends MenuBar implements MenuBarListener, Constants {
private OnMenuItemClickListener mListener;
public TwidereMenuBar(Context context) {
super(context);
}
public TwidereMenuBar(Context context, AttributeSet attrs) {
super(context, attrs);
setMenuBarListener(this);
}
public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {
mListener = listener;
}
@Override
public MenuInflater getMenuInflater() {
return new TwidereMenuInflater(getContext());
public void onPreShowMenu(Menu menu) {
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"?>
<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"
android:layout_width="@dimen/float_action_button_size"
android:layout_height="@dimen/float_action_button_size"

View File

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

View File

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

View File

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

View File

@ -645,5 +645,6 @@
<string name="excluded">Excluded</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="no_version_suffix">No version suffix</string>
</resources>