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

@ -19,18 +19,6 @@
package org.mariotaku.twidere.fragment.support;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getDisplayName;
import static org.mariotaku.twidere.util.Utils.getLocalizedNumber;
import static org.mariotaku.twidere.util.Utils.getTwitterInstance;
import static org.mariotaku.twidere.util.Utils.openUserListMembers;
import static org.mariotaku.twidere.util.Utils.openUserListSubscribers;
import static org.mariotaku.twidere.util.Utils.openUserListTimeline;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@ -67,6 +55,7 @@ import android.widget.ListView;
import android.widget.TextView;
import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.menucomponent.widget.MenuBar.MenuBarListener;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.adapter.ListActionAdapter;
@ -82,12 +71,25 @@ import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereLinkify;
import org.mariotaku.twidere.view.ColorLabelRelativeLayout;
import org.mariotaku.twidere.view.TwidereMenuBar;
import java.util.Locale;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.UserList;
import java.util.Locale;
import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getDisplayName;
import static org.mariotaku.twidere.util.Utils.getLocalizedNumber;
import static org.mariotaku.twidere.util.Utils.getTwitterInstance;
import static org.mariotaku.twidere.util.Utils.openUserListMembers;
import static org.mariotaku.twidere.util.Utils.openUserListSubscribers;
import static org.mariotaku.twidere.util.Utils.openUserListTimeline;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
import static org.mariotaku.twidere.util.Utils.setMenuItemAvailability;
public class UserListDetailsFragment extends BaseSupportListFragment implements OnClickListener, OnItemClickListener,
OnItemLongClickListener, OnMenuItemClickListener, LoaderCallbacks<SingleResponse<ParcelableUserList>>,
@ -104,7 +106,7 @@ public class UserListDetailsFragment extends BaseSupportListFragment implements
private Button mRetryButton;
private ListView mListView;
private View mHeaderView;
private MenuBar mMenuBar;
private TwidereMenuBar mMenuBar;
private ListActionAdapter mAdapter;
@ -120,7 +122,8 @@ public class UserListDetailsFragment extends BaseSupportListFragment implements
if (getActivity() == null || !isAdded() || isDetached()) return;
final String action = intent.getAction();
final ParcelableUserList user_list = intent.getParcelableExtra(EXTRA_USER_LIST);
if (user_list == null || mUserList == null || !intent.getBooleanExtra(EXTRA_SUCCEED, false)) return;
if (user_list == null || mUserList == null || !intent.getBooleanExtra(EXTRA_SUCCEED, false))
return;
if (BROADCAST_USER_LIST_DETAILS_UPDATED.equals(action)) {
if (user_list.id == mUserList.id) {
getUserListInfo(true);
@ -263,7 +266,7 @@ public class UserListDetailsFragment extends BaseSupportListFragment implements
mErrorRetryContainer = containerView.findViewById(R.id.error_retry_container);
mRetryButton = (Button) containerView.findViewById(R.id.retry);
mErrorMessageView = (TextView) containerView.findViewById(R.id.error_message);
mMenuBar = (MenuBar) containerView.findViewById(R.id.menu_bar);
mMenuBar = (TwidereMenuBar) containerView.findViewById(R.id.menu_bar);
final View cardView = mHeaderView.findViewById(R.id.card);
ThemeUtils.applyThemeAlphaToDrawable(cardView.getContext(), cardView.getBackground());
return containerView;

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,6 +35,9 @@ 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>() {
@ -229,7 +229,7 @@ public class Account implements Parcelable {
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 boolean same_oauth_signing_url, no_version_suffix;
public AccountWithCredentials(final Cursor cursor, final Indices indices) {
super(cursor, indices);
@ -242,6 +242,7 @@ public class Account implements Parcelable {
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
@ -265,7 +266,7 @@ public class Account implements Parcelable {
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;
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);
@ -284,6 +285,7 @@ public class Account implements Parcelable {
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

View File

@ -48,12 +48,12 @@ public interface TweetStore {
public static final Uri CONTENT_URI_DATABASE_READY = Uri.withAppendedPath(BASE_CONTENT_URI,
CONTENT_PATH_DATABASE_READY);
public static final Uri[] STATUSES_URIS = new Uri[] { Statuses.CONTENT_URI, Mentions.CONTENT_URI,
CachedStatuses.CONTENT_URI };
public static final Uri[] CACHE_URIS = new Uri[] { CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI,
CachedHashtags.CONTENT_URI, CachedTrends.Local.CONTENT_URI };
public static final Uri[] DIRECT_MESSAGES_URIS = new Uri[] { DirectMessages.Inbox.CONTENT_URI,
DirectMessages.Outbox.CONTENT_URI };
public static final Uri[] STATUSES_URIS = new Uri[]{Statuses.CONTENT_URI, Mentions.CONTENT_URI,
CachedStatuses.CONTENT_URI};
public static final Uri[] CACHE_URIS = new Uri[]{CachedUsers.CONTENT_URI, CachedStatuses.CONTENT_URI,
CachedHashtags.CONTENT_URI, CachedTrends.Local.CONTENT_URI};
public static final Uri[] DIRECT_MESSAGES_URIS = new Uri[]{DirectMessages.Inbox.CONTENT_URI,
DirectMessages.Outbox.CONTENT_URI};
public static interface Accounts extends BaseColumns {
@ -132,25 +132,26 @@ public interface TweetStore {
public static final String PROFILE_BANNER_URL = "profile_banner_url";
public static final String API_URL_FORMAT = "api_url_format";
public static final String SAME_OAUTH_SIGNING_URL = "same_oauth_signing_url";
public static final String NO_VERSION_SUFFIX = "no_version_suffix";
public static final String[] COLUMNS_NO_CREDENTIALS = new String[] { _ID, NAME, SCREEN_NAME, ACCOUNT_ID,
PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, IS_ACTIVATED };
public static final String[] COLUMNS_NO_CREDENTIALS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID,
PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR, IS_ACTIVATED};
public static final String[] COLUMNS = new String[] { _ID, NAME, SCREEN_NAME, ACCOUNT_ID, AUTH_TYPE,
public static final String[] COLUMNS = new String[]{_ID, NAME, SCREEN_NAME, ACCOUNT_ID, AUTH_TYPE,
BASIC_AUTH_USERNAME, BASIC_AUTH_PASSWORD, OAUTH_TOKEN, OAUTH_TOKEN_SECRET, CONSUMER_KEY,
CONSUMER_SECRET, API_URL_FORMAT, SAME_OAUTH_SIGNING_URL, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR,
IS_ACTIVATED };
CONSUMER_SECRET, API_URL_FORMAT, SAME_OAUTH_SIGNING_URL, NO_VERSION_SUFFIX, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, COLOR,
IS_ACTIVATED};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL,
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT_NOT_NULL,
TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN };
TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN};
}
public static interface CachedHashtags extends CachedValues {
public static final String[] COLUMNS = new String[] { _ID, NAME };
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT };
public static final String[] COLUMNS = new String[]{_ID, NAME};
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT};
public static final String TABLE_NAME = "cached_hashtags";
public static final String CONTENT_PATH = TABLE_NAME;
@ -168,9 +169,9 @@ public interface TweetStore {
public static final String PATH = "path";
public static final String[] MATRIX_COLUMNS = new String[] { URL, PATH };
public static final String[] MATRIX_COLUMNS = new String[]{URL, PATH};
public static final String[] COLUMNS = new String[] { _ID, URL, PATH };
public static final String[] COLUMNS = new String[]{_ID, URL, PATH};
}
public static interface CachedStatuses extends Statuses {
@ -184,8 +185,8 @@ public interface TweetStore {
public static final String TIMESTAMP = "timestamp";
public static final String[] COLUMNS = new String[] { _ID, NAME, TIMESTAMP };
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_INT };
public static final String[] COLUMNS = new String[]{_ID, NAME, TIMESTAMP};
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_INT};
public static interface Local extends CachedTrends {
public static final String TABLE_NAME = "local_trends";
@ -248,14 +249,14 @@ public interface TweetStore {
*/
public static final String PROFILE_IMAGE_URL = "profile_image_url";
public static final String[] COLUMNS = new String[] { _ID, USER_ID, CREATED_AT, NAME, SCREEN_NAME,
public static final String[] COLUMNS = new String[]{_ID, USER_ID, CREATED_AT, NAME, SCREEN_NAME,
DESCRIPTION_PLAIN, LOCATION, URL, PROFILE_IMAGE_URL, PROFILE_BANNER_URL, IS_PROTECTED, IS_VERIFIED,
IS_FOLLOWING, FOLLOWERS_COUNT, FRIENDS_COUNT, STATUSES_COUNT, FAVORITES_COUNT, DESCRIPTION_HTML,
DESCRIPTION_EXPANDED, URL_EXPANDED };
DESCRIPTION_EXPANDED, URL_EXPANDED};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT,
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_INT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_BOOLEAN, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT };
TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
}
@ -274,9 +275,9 @@ public interface TweetStore {
public static final String PATH = "path";
public static final String[] MATRIX_COLUMNS = new String[] { NAME, PATH };
public static final String[] MATRIX_COLUMNS = new String[]{NAME, PATH};
public static final String[] COLUMNS = new String[] { _ID, NAME, PATH };
public static final String[] COLUMNS = new String[]{_ID, NAME, PATH};
}
public static interface DirectMessages extends BaseColumns {
@ -308,13 +309,13 @@ public interface TweetStore {
public static final String FIRST_MEDIA = "first_media";
public static final String[] COLUMNS = new String[] { _ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP,
public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, MESSAGE_ID, MESSAGE_TIMESTAMP,
SENDER_ID, RECIPIENT_ID, IS_OUTGOING, TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, SENDER_NAME,
RECIPIENT_NAME, SENDER_SCREEN_NAME, RECIPIENT_SCREEN_NAME, SENDER_PROFILE_IMAGE_URL,
RECIPIENT_PROFILE_IMAGE_URL, MEDIAS, FIRST_MEDIA };
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,
RECIPIENT_PROFILE_IMAGE_URL, MEDIAS, FIRST_MEDIA};
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,
TYPE_INT, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT };
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
public static final String DEFAULT_SORT_ORDER = MESSAGE_ID + " DESC";
@ -401,9 +402,9 @@ public interface TweetStore {
public static final String ADDRESS = "address";
public static final String[] MATRIX_COLUMNS = new String[] { HOST, ADDRESS };
public static final String[] MATRIX_COLUMNS = new String[]{HOST, ADDRESS};
public static final String[] COLUMNS = new String[] { _ID, HOST, ADDRESS };
public static final String[] COLUMNS = new String[]{_ID, HOST, ADDRESS};
}
public static interface Drafts extends BaseColumns {
@ -443,11 +444,11 @@ public interface TweetStore {
public static final String ACTION_EXTRAS = "action_extras";
public static final String[] COLUMNS = new String[] { _ID, TEXT, ACCOUNT_IDS, LOCATION, MEDIAS,
IN_REPLY_TO_STATUS_ID, IS_POSSIBLY_SENSITIVE, TIMESTAMP, ACTION_TYPE, ACTION_EXTRAS };
public static final String[] COLUMNS = new String[]{_ID, TEXT, ACCOUNT_IDS, LOCATION, MEDIAS,
IN_REPLY_TO_STATUS_ID, IS_POSSIBLY_SENSITIVE, TIMESTAMP, ACTION_TYPE, ACTION_EXTRAS};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT };
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT,
TYPE_INT, TYPE_INT, TYPE_BOOLEAN, TYPE_INT, TYPE_INT, TYPE_TEXT};
}
@ -465,9 +466,9 @@ public interface TweetStore {
public static final String ENABLE_FOR_RETWEETS = "enable_for_retweets";
public static final String[] COLUMNS = new String[] { _ID, VALUE };
public static final String[] COLUMNS = new String[]{_ID, VALUE};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL_UNIQUE };
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL_UNIQUE};
public static interface Keywords extends Filters {
@ -504,10 +505,10 @@ public interface TweetStore {
public static final String NAME = "name";
public static final String SCREEN_NAME = "screen_name";
public static final String[] COLUMNS = new String[] { _ID, USER_ID, NAME, SCREEN_NAME };
public static final String[] COLUMNS = new String[]{_ID, USER_ID, NAME, SCREEN_NAME};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_TEXT_NOT_NULL,
TYPE_TEXT_NOT_NULL };
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT_UNIQUE, TYPE_TEXT_NOT_NULL,
TYPE_TEXT_NOT_NULL};
}
}
@ -532,9 +533,9 @@ public interface TweetStore {
public static final String COUNT = "count";
public static final String[] MATRIX_COLUMNS = new String[] { ID, COUNT };
public static final String[] MATRIX_COLUMNS = new String[]{ID, COUNT};
public static final String[] COLUMNS = new String[] { _ID, ID, COUNT };
public static final String[] COLUMNS = new String[]{_ID, ID, COUNT};
}
public static interface Permissions extends BaseColumns {
@ -547,9 +548,9 @@ public interface TweetStore {
public static final String PACKAGE_NAME = "package_name";
public static final String[] MATRIX_COLUMNS = new String[] { PACKAGE_NAME, PERMISSION };
public static final String[] MATRIX_COLUMNS = new String[]{PACKAGE_NAME, PERMISSION};
public static final String[] COLUMNS = new String[] { _ID, PACKAGE_NAME, PERMISSION };
public static final String[] COLUMNS = new String[]{_ID, PACKAGE_NAME, PERMISSION};
}
public static interface Preferences extends BaseColumns {
@ -578,9 +579,9 @@ public interface TweetStore {
public static final String TYPE = "type";
public static final String[] MATRIX_COLUMNS = new String[] { KEY, VALUE, TYPE };
public static final String[] MATRIX_COLUMNS = new String[]{KEY, VALUE, TYPE};
public static final String[] COLUMNS = new String[] { _ID, KEY, VALUE, TYPE };
public static final String[] COLUMNS = new String[]{_ID, KEY, VALUE, TYPE};
}
public static interface Statuses extends BaseColumns {
@ -715,18 +716,18 @@ public interface TweetStore {
public static final String DEFAULT_SORT_ORDER = SORT_ORDER_TIMESTAMP_DESC;
public static final String[] COLUMNS = new String[] { _ID, ACCOUNT_ID, STATUS_ID, USER_ID, STATUS_TIMESTAMP,
public static final String[] COLUMNS = new String[]{_ID, ACCOUNT_ID, STATUS_ID, USER_ID, STATUS_TIMESTAMP,
TEXT_HTML, TEXT_PLAIN, TEXT_UNESCAPED, USER_NAME, USER_SCREEN_NAME, USER_PROFILE_IMAGE_URL,
IN_REPLY_TO_STATUS_ID, IN_REPLY_TO_USER_ID, IN_REPLY_TO_USER_NAME, IN_REPLY_TO_USER_SCREEN_NAME,
SOURCE, LOCATION, RETWEET_COUNT, FAVORITE_COUNT, RETWEET_ID, RETWEET_TIMESTAMP, RETWEETED_BY_USER_ID,
RETWEETED_BY_USER_NAME, RETWEETED_BY_USER_SCREEN_NAME, MY_RETWEET_ID, IS_RETWEET, IS_FAVORITE,
IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIAS, FIRST_MEDIA, MENTIONS };
IS_PROTECTED, IS_VERIFIED, IS_FOLLOWING, IS_GAP, IS_POSSIBLY_SENSITIVE, MEDIAS, FIRST_MEDIA, MENTIONS};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT,
TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_TEXT,
TYPE_TEXT, TYPE_INT, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_BOOLEAN,
TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT };
TYPE_BOOLEAN, TYPE_BOOLEAN, TYPE_TEXT, TYPE_TEXT, TYPE_TEXT};
}
@ -748,10 +749,10 @@ public interface TweetStore {
public static final String POSITION = "position";
public static final String[] COLUMNS = new String[] { _ID, NAME, ICON, TYPE, ARGUMENTS, EXTRAS, POSITION };
public static final String[] COLUMNS = new String[]{_ID, NAME, ICON, TYPE, ARGUMENTS, EXTRAS, POSITION};
public static final String[] TYPES = new String[] { TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_INT };
public static final String[] TYPES = new String[]{TYPE_PRIMARY_KEY, TYPE_TEXT_NOT_NULL, TYPE_TEXT, TYPE_TEXT,
TYPE_TEXT, TYPE_TEXT, TYPE_INT};
public static final String DEFAULT_SORT_ORDER = POSITION + " ASC";
}
@ -768,9 +769,9 @@ public interface TweetStore {
public static final String COUNT = "count";
public static final String[] MATRIX_COLUMNS = new String[] { TAB_POSITION, TAB_TYPE, COUNT };
public static final String[] MATRIX_COLUMNS = new String[]{TAB_POSITION, TAB_TYPE, COUNT};
public static final String[] COLUMNS = new String[] { _ID, TAB_POSITION, TAB_TYPE, COUNT };
public static final String[] COLUMNS = new String[]{_ID, TAB_POSITION, TAB_TYPE, COUNT};
public static interface ByType extends UnreadCounts {

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,13 +55,13 @@ 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) {
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;
@ -75,12 +76,13 @@ public final class ContentValuesCreator implements TwidereConstants {
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) {
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();
@ -98,11 +100,12 @@ public final class ContentValuesCreator implements TwidereConstants {
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) {
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);
@ -114,6 +117,7 @@ public final class ContentValuesCreator implements TwidereConstants {
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;
}
@ -208,10 +212,10 @@ public final class ContentValuesCreator implements TwidereConstants {
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.ACCOUNT_IDS, ArrayUtils.toString(new long[]{accountId}, ',', false));
values.put(Drafts.TIMESTAMP, System.currentTimeMillis());
if (imageUri != null) {
final ParcelableMediaUpdate[] medias = { new ParcelableMediaUpdate(imageUri, 0) };
final ParcelableMediaUpdate[] medias = {new ParcelableMediaUpdate(imageUri, 0)};
values.put(Drafts.MEDIAS, JSONSerializer.toJSONArrayString(medias));
}
final JSONObject extras = new JSONObject();
@ -224,7 +228,7 @@ public final class ContentValuesCreator implements TwidereConstants {
return values;
}
public static ContentValues makeFilterdUserContentValues(final ParcelableStatus status) {
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);
@ -233,7 +237,7 @@ public final class ContentValuesCreator implements TwidereConstants {
return values;
}
public static ContentValues makeFilterdUserContentValues(final ParcelableUser user) {
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);
@ -242,7 +246,7 @@ public final class ContentValuesCreator implements TwidereConstants {
return values;
}
public static ContentValues makeFilterdUserContentValues(final ParcelableUserMention user) {
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);
@ -258,17 +262,17 @@ public final class ContentValuesCreator implements TwidereConstants {
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 boolean isRetweet = 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;
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;
}
@ -300,7 +304,7 @@ public final class ContentValuesCreator implements TwidereConstants {
if (location != null) {
values.put(Statuses.LOCATION, location.getLatitude() + "," + location.getLongitude());
}
values.put(Statuses.IS_RETWEET, is_retweet);
values.put(Statuses.IS_RETWEET, isRetweet);
values.put(Statuses.IS_FAVORITE, status.isFavorited());
final ParcelableMedia[] medias = ParcelableMedia.fromEntities(status);
if (medias != null) {
@ -334,10 +338,10 @@ public final class ContentValuesCreator implements TwidereConstants {
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) {
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;
}
@ -346,10 +350,10 @@ public final class ContentValuesCreator implements TwidereConstants {
final ContentValues values = new ContentValues();
values.put(CachedTrends.NAME, trend.getName());
values.put(CachedTrends.TIMESTAMP, timestamp);
result_list.add(values);
resultList.add(values);
}
}
return result_list.toArray(new ContentValues[result_list.size()]);
return resultList.toArray(new ContentValues[resultList.size()]);
}
}

View File

@ -52,7 +52,6 @@ import java.util.TreeSet;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.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,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
<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"
@ -16,6 +17,15 @@
android:text="@string/same_oauth_signing_url"
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"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"

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>