this commit may fix wrong profile image bug

This commit is contained in:
Mariotaku Lee 2014-08-08 01:58:42 +08:00
parent 059360a942
commit 9c7bace28e
63 changed files with 2853 additions and 2652 deletions

View File

@ -1,8 +1,8 @@
package org.mariotaku.twidere.activity;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.support.v4.app.FragmentActivity;
import com.negusoft.holoaccent.AccentHelper;
import com.negusoft.holoaccent.AccentResources;
@ -15,8 +15,14 @@ import com.negusoft.holoaccent.AccentResources;
*/
public class AccentActivity extends Activity {
private final AccentHelper mAccentHelper = new AccentHelper(getOverrideAccentColor(),
getOverrideAccentColorDark(), getOverrideAccentColorActionBar(), new MyInitListener());
private AccentHelper mAccentHelper;
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
mAccentHelper = new AccentHelper(getOverrideAccentColor(),
getOverrideAccentColorDark(), getOverrideAccentColorActionBar(), new MyInitListener());
}
@Override
public Resources getResources() {

View File

@ -39,7 +39,7 @@ public class BaseActivity extends BaseThemedActivity implements Constants {
}
@Override
public int getThemeColor() {
public int getOverrideAccentColor() {
return ThemeUtils.getUserThemeColor(this);
}

View File

@ -99,7 +99,7 @@ public abstract class BasePreferenceActivity extends PreferenceActivity implemen
}
@Override
public int getThemeColor() {
public int getOverrideAccentColor() {
return 0;
}

View File

@ -93,7 +93,7 @@ public abstract class BaseThemedActivity extends AccentActivity implements IThem
}
@Override
public abstract int getThemeColor();
public abstract int getOverrideAccentColor();
@Override
public String getThemeFontFamily() {
@ -134,7 +134,7 @@ public abstract class BaseThemedActivity extends AccentActivity implements IThem
}
protected final boolean isThemeChanged() {
return getThemeResourceId() != mCurrentThemeResource || getThemeColor() != mCurrentThemeColor
return getThemeResourceId() != mCurrentThemeResource || getOverrideAccentColor() != mCurrentThemeColor
|| !CompareUtils.objectEquals(getThemeFontFamily(), mCurrentThemeFontFamily)
|| getThemeBackgroundAlpha() != mCurrentThemeBackgroundAlpha;
}
@ -178,7 +178,7 @@ public abstract class BaseThemedActivity extends AccentActivity implements IThem
private final void setTheme() {
mCurrentThemeResource = getThemeResourceId();
mCurrentThemeColor = getThemeColor();
mCurrentThemeColor = getOverrideAccentColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
ThemeUtils.notifyStatusBarColorChanged(this, mCurrentThemeResource, mCurrentThemeColor,

View File

@ -51,248 +51,249 @@ import java.util.List;
public class SettingsActivity extends BasePreferenceActivity {
private static long HEADER_ID_RESTORE_ICON = 1001;
private static long HEADER_ID_RESTORE_ICON = 1001;
private SharedPreferences mPreferences;
private PackageManager mPackageManager;
private SharedPreferences mPreferences;
private PackageManager mPackageManager;
private HeaderAdapter mAdapter;
private HeaderAdapter mAdapter;
private int mCurrentThemeColor, mCurrentThemeBackgroundAlpha;
private boolean mCompactCards, mPlainListStyle;
private int mCurrentThemeColor, mCurrentThemeBackgroundAlpha;
private boolean mCompactCards, mPlainListStyle;
private String mCurrentThemeFontFamily;
private String mCurrentThemeFontFamily;
private boolean mCurrentIsDarkDrawerEnabled;
private boolean mCurrentIsDarkDrawerEnabled;
@Override
public void finish() {
if (shouldNotifyThemeChange()) {
final Intent data = new Intent();
data.putExtra(EXTRA_RESTART_ACTIVITY, true);
setResult(RESULT_OK, data);
}
super.finish();
}
@Override
public void finish() {
if (shouldNotifyThemeChange()) {
final Intent data = new Intent();
data.putExtra(EXTRA_RESTART_ACTIVITY, true);
setResult(RESULT_OK, data);
}
super.finish();
}
public HeaderAdapter getHeaderAdapter() {
if (mAdapter != null) return mAdapter;
return mAdapter = new HeaderAdapter(ThemeUtils.getThemedContextForActionIcons(this, getThemeResourceId()));
}
public HeaderAdapter getHeaderAdapter() {
if (mAdapter != null) return mAdapter;
return mAdapter = new HeaderAdapter(ThemeUtils.getThemedContextForActionIcons(this, getThemeResourceId()));
}
@Override
public void onBuildHeaders(final List<Header> target) {
loadHeadersFromResource(R.xml.settings_headers, target);
final HeaderAdapter adapter = getHeaderAdapter();
adapter.clear();
adapter.addAll(target);
final ComponentName main = new ComponentName(this, MainActivity.class);
if (mPackageManager.getComponentEnabledSetting(main) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
final Header restoreIconHeader = new Header();
restoreIconHeader.titleRes = R.string.want_old_icon_back;
restoreIconHeader.title = getString(restoreIconHeader.titleRes);
restoreIconHeader.id = HEADER_ID_RESTORE_ICON;
restoreIconHeader.intent = getIntent();
adapter.add(restoreIconHeader);
}
}
@Override
public void onBuildHeaders(final List<Header> target) {
loadHeadersFromResource(R.xml.settings_headers, target);
final HeaderAdapter adapter = getHeaderAdapter();
adapter.clear();
adapter.addAll(target);
final ComponentName main = new ComponentName(this, MainActivity.class);
if (mPackageManager.getComponentEnabledSetting(main) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
final Header restoreIconHeader = new Header();
restoreIconHeader.titleRes = R.string.want_old_icon_back;
restoreIconHeader.title = getString(restoreIconHeader.titleRes);
restoreIconHeader.id = HEADER_ID_RESTORE_ICON;
restoreIconHeader.intent = getIntent();
adapter.add(restoreIconHeader);
}
}
@Override
public boolean onCreateOptionsMenu(final Menu menu, final TwidereMenuInflater inflater) {
if (getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) != null) return false;
inflater.inflate(R.menu.menu_settings, menu);
return true;
}
@Override
public boolean onCreateOptionsMenu(final Menu menu, final TwidereMenuInflater inflater) {
if (getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT) != null) return false;
inflater.inflate(R.menu.menu_settings, menu);
return true;
}
@Override
public void onHeaderClick(final Header header, final int position) {
if (header.id == HEADER_ID_RESTORE_ICON) {
final ComponentName main = new ComponentName(this, MainActivity.class);
final ComponentName main2 = new ComponentName(this, MainHondaJOJOActivity.class);
mPackageManager.setComponentEnabledSetting(main, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
mPackageManager.setComponentEnabledSetting(main2, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Toast.makeText(this, R.string.icon_restored_message, Toast.LENGTH_SHORT).show();
finish();
return;
}
super.onHeaderClick(header, position);
}
@Override
public void onHeaderClick(final Header header, final int position) {
if (header.id == HEADER_ID_RESTORE_ICON) {
final ComponentName main = new ComponentName(this, MainActivity.class);
final ComponentName main2 = new ComponentName(this, MainHondaJOJOActivity.class);
mPackageManager.setComponentEnabledSetting(main, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
mPackageManager.setComponentEnabledSetting(main2, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
Toast.makeText(this, R.string.icon_restored_message, Toast.LENGTH_SHORT).show();
finish();
return;
}
super.onHeaderClick(header, position);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
onBackPressed();
return true;
}
case MENU_IMPORT_SETTINGS: {
final Intent intent = new Intent(this, DataImportActivity.class);
startActivity(intent);
return true;
}
case MENU_EXPORT_SETTINGS: {
final Intent intent = new Intent(this, DataExportActivity.class);
startActivity(intent);
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
onBackPressed();
return true;
}
case MENU_IMPORT_SETTINGS: {
final Intent intent = new Intent(this, DataImportActivity.class);
startActivity(intent);
return true;
}
case MENU_EXPORT_SETTINGS: {
final Intent intent = new Intent(this, DataExportActivity.class);
startActivity(intent);
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
public void setListAdapter(final ListAdapter adapter) {
if (adapter == null) {
super.setListAdapter(null);
} else {
super.setListAdapter(getHeaderAdapter());
}
}
@Override
public void setListAdapter(final ListAdapter adapter) {
if (adapter == null) {
super.setListAdapter(null);
} else {
super.setListAdapter(getHeaderAdapter());
}
}
@Override
public void switchToHeader(final Header header) {
if (header == null || header.fragment == null && header.intent == null) return;
super.switchToHeader(header);
}
@Override
public void switchToHeader(final Header header) {
if (header == null || header.fragment == null && header.intent == null) return;
super.switchToHeader(header);
}
@Override
public void switchToHeader(final String fragmentName, final Bundle args) {
if (fragmentName == null) return;
super.switchToHeader(fragmentName, args);
}
@Override
public void switchToHeader(final String fragmentName, final Bundle args) {
if (fragmentName == null) return;
super.switchToHeader(fragmentName, args);
}
@Override
protected boolean isValidFragment(final String fragmentName) {
final Class<?> cls;
try {
cls = Class.forName(fragmentName);
} catch (final ClassNotFoundException e) {
return false;
}
return Fragment.class.isAssignableFrom(cls);
}
@Override
protected boolean isValidFragment(final String fragmentName) {
final Class<?> cls;
try {
cls = Class.forName(fragmentName);
} catch (final ClassNotFoundException e) {
return false;
}
return Fragment.class.isAssignableFrom(cls);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
mPackageManager = getPackageManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
mCompactCards = mPreferences.getBoolean(KEY_COMPACT_CARDS, false);
mPlainListStyle = mPreferences.getBoolean(KEY_PLAIN_LIST_STYLE, false);
mCurrentThemeColor = getThemeColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mCurrentIsDarkDrawerEnabled = isDarkDrawerEnabled();
super.onCreate(savedInstanceState);
setIntent(getIntent().addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
final ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
if (savedInstanceState != null) {
invalidateHeaders();
}
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
mPackageManager = getPackageManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
mCompactCards = mPreferences.getBoolean(KEY_COMPACT_CARDS, false);
mPlainListStyle = mPreferences.getBoolean(KEY_PLAIN_LIST_STYLE, false);
mCurrentThemeColor = getOverrideAccentColor();
mCurrentThemeFontFamily = getThemeFontFamily();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mCurrentIsDarkDrawerEnabled = isDarkDrawerEnabled();
super.onCreate(savedInstanceState);
setIntent(getIntent().addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
final ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
if (savedInstanceState != null) {
invalidateHeaders();
}
}
private boolean shouldNotifyThemeChange() {
return mCompactCards != mPreferences.getBoolean(KEY_COMPACT_CARDS, false)
|| mPlainListStyle != mPreferences.getBoolean(KEY_PLAIN_LIST_STYLE, false)
|| getThemeResourceId() != getCurrentThemeResourceId() || getThemeColor() != mCurrentThemeColor
|| !CompareUtils.objectEquals(getThemeFontFamily(), mCurrentThemeFontFamily)
|| getThemeBackgroundAlpha() != mCurrentThemeBackgroundAlpha
|| isDarkDrawerEnabled() != mCurrentIsDarkDrawerEnabled;
}
private boolean shouldNotifyThemeChange() {
return mCompactCards != mPreferences.getBoolean(KEY_COMPACT_CARDS, false)
|| mPlainListStyle != mPreferences.getBoolean(KEY_PLAIN_LIST_STYLE, false)
|| getThemeResourceId() != getCurrentThemeResourceId()
|| ThemeUtils.getUserThemeColor(this) != mCurrentThemeColor
|| !CompareUtils.objectEquals(getThemeFontFamily(), mCurrentThemeFontFamily)
|| getThemeBackgroundAlpha() != mCurrentThemeBackgroundAlpha
|| isDarkDrawerEnabled() != mCurrentIsDarkDrawerEnabled;
}
private static class HeaderAdapter extends ArrayAdapter<Header> {
private static class HeaderAdapter extends ArrayAdapter<Header> {
static final int HEADER_TYPE_CATEGORY = 0;
static final int HEADER_TYPE_NORMAL = 1;
static final int HEADER_TYPE_CATEGORY = 0;
static final int HEADER_TYPE_NORMAL = 1;
private final Context mContext;
private final Resources mResources;
private final Context mContext;
private final Resources mResources;
public HeaderAdapter(final Context context) {
super(context, R.layout.list_item_preference_header);
mContext = context;
mResources = context.getResources();
}
public HeaderAdapter(final Context context) {
super(context, R.layout.list_item_preference_header);
mContext = context;
mResources = context.getResources();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public int getItemViewType(final int position) {
final Header header = getItem(position);
return getHeaderType(header);
}
@Override
public int getItemViewType(final int position) {
final Header header = getItem(position);
return getHeaderType(header);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final Header header = getItem(position);
final int viewType = getHeaderType(header);
final View view;
switch (viewType) {
case HEADER_TYPE_CATEGORY: {
view = new TextView(mContext, null, android.R.attr.listSeparatorTextViewStyle);
((TextView) view).setText(header.getTitle(mResources));
break;
}
default: {
final boolean viewChanged = convertView != null
&& !(convertView.getTag() instanceof HeaderViewHolder);
view = super.getView(position, viewChanged ? null : convertView, parent);
final HeaderViewHolder holder;
final Object tag = view.getTag();
if (tag instanceof HeaderViewHolder) {
holder = (HeaderViewHolder) tag;
} else {
holder = new HeaderViewHolder(view);
view.setTag(holder);
}
final CharSequence title = header.getTitle(mResources);
holder.title.setText(title);
final CharSequence summary = header.getSummary(mResources);
if (!TextUtils.isEmpty(summary)) {
holder.summary.setVisibility(View.VISIBLE);
holder.summary.setText(summary);
} else {
holder.summary.setVisibility(View.GONE);
}
if (header.iconRes != 0) {
holder.icon.setImageDrawable(mResources.getDrawable(header.iconRes));
} else {
holder.icon.setImageDrawable(null);
}
break;
}
}
return view;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final Header header = getItem(position);
final int viewType = getHeaderType(header);
final View view;
switch (viewType) {
case HEADER_TYPE_CATEGORY: {
view = new TextView(mContext, null, android.R.attr.listSeparatorTextViewStyle);
((TextView) view).setText(header.getTitle(mResources));
break;
}
default: {
final boolean viewChanged = convertView != null
&& !(convertView.getTag() instanceof HeaderViewHolder);
view = super.getView(position, viewChanged ? null : convertView, parent);
final HeaderViewHolder holder;
final Object tag = view.getTag();
if (tag instanceof HeaderViewHolder) {
holder = (HeaderViewHolder) tag;
} else {
holder = new HeaderViewHolder(view);
view.setTag(holder);
}
final CharSequence title = header.getTitle(mResources);
holder.title.setText(title);
final CharSequence summary = header.getSummary(mResources);
if (!TextUtils.isEmpty(summary)) {
holder.summary.setVisibility(View.VISIBLE);
holder.summary.setText(summary);
} else {
holder.summary.setVisibility(View.GONE);
}
if (header.iconRes != 0) {
holder.icon.setImageDrawable(mResources.getDrawable(header.iconRes));
} else {
holder.icon.setImageDrawable(null);
}
break;
}
}
return view;
}
@Override
public boolean isEnabled(final int position) {
return getItemViewType(position) != HEADER_TYPE_CATEGORY;
}
@Override
public boolean isEnabled(final int position) {
return getItemViewType(position) != HEADER_TYPE_CATEGORY;
}
private static int getHeaderType(final Header header) {
if (header.fragment == null && header.intent == null)
return HEADER_TYPE_CATEGORY;
else
return HEADER_TYPE_NORMAL;
}
private static int getHeaderType(final Header header) {
if (header.fragment == null && header.intent == null)
return HEADER_TYPE_CATEGORY;
else
return HEADER_TYPE_NORMAL;
}
private static class HeaderViewHolder extends ViewHolder {
private final TextView title, summary;
private final ImageView icon;
private static class HeaderViewHolder extends ViewHolder {
private final TextView title, summary;
private final ImageView icon;
HeaderViewHolder(final View view) {
super(view);
title = (TextView) findViewById(android.R.id.title);
summary = (TextView) findViewById(android.R.id.summary);
icon = (ImageView) findViewById(android.R.id.icon);
}
}
HeaderViewHolder(final View view) {
super(view);
title = (TextView) findViewById(android.R.id.title);
summary = (TextView) findViewById(android.R.id.summary);
icon = (ImageView) findViewById(android.R.id.icon);
}
}
}
}
}

View File

@ -1,7 +1,5 @@
package org.mariotaku.twidere.activity;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
@ -20,174 +18,219 @@ import org.mariotaku.twidere.util.Utils;
import java.util.List;
import static org.mariotaku.twidere.util.Utils.getDefaultAccountId;
public class TwitterLinkHandlerActivity extends Activity implements Constants {
public static final String[] TWITTER_RESERVED_PATHS = { "about", "account", "accounts", "activity", "all",
"announcements", "anywhere", "api_rules", "api_terms", "apirules", "apps", "auth", "badges", "blog",
"business", "buttons", "contacts", "devices", "direct_messages", "download", "downloads",
"edit_announcements", "faq", "favorites", "find_sources", "find_users", "followers", "following",
"friend_request", "friendrequest", "friends", "goodies", "help", "home", "im_account", "inbox",
"invitations", "invite", "jobs", "list", "login", "logo", "logout", "me", "mentions", "messages",
"mockview", "newtwitter", "notifications", "nudge", "oauth", "phoenix_search", "positions", "privacy",
"public_timeline", "related_tweets", "replies", "retweeted_of_mine", "retweets", "retweets_by_others",
"rules", "saved_searches", "search", "sent", "settings", "share", "signup", "signin", "similar_to",
"statistics", "terms", "tos", "translate", "trends", "tweetbutton", "twttr", "update_discoverability",
"users", "welcome", "who_to_follow", "widgets", "zendesk_auth", "media_signup" };
public static final String[] TWITTER_RESERVED_PATHS = {"about", "account", "accounts", "activity", "all",
"announcements", "anywhere", "api_rules", "api_terms", "apirules", "apps", "auth", "badges", "blog",
"business", "buttons", "contacts", "devices", "direct_messages", "download", "downloads",
"edit_announcements", "faq", "favorites", "find_sources", "find_users", "followers", "following",
"friend_request", "friendrequest", "friends", "goodies", "help", "home", "im_account", "inbox",
"invitations", "invite", "jobs", "list", "login", "logo", "logout", "me", "mentions", "messages",
"mockview", "newtwitter", "notifications", "nudge", "oauth", "phoenix_search", "positions", "privacy",
"public_timeline", "related_tweets", "replies", "retweeted_of_mine", "retweets", "retweets_by_others",
"rules", "saved_searches", "search", "sent", "settings", "share", "signup", "signin", "similar_to",
"statistics", "terms", "tos", "translate", "trends", "tweetbutton", "twttr", "update_discoverability",
"users", "welcome", "who_to_follow", "widgets", "zendesk_auth", "media_signup"};
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final String AUTHORITY_TWITTER_COM = "twitter.com";
private static final String AUTHORITY_TWITTER_COM = "twitter.com";
private static final int URI_CODE_TWITTER_STATUS = 1;
private static final int URI_CODE_TWITTER_USER = 2;
private static final int URI_CODE_TWITTER_USER_FOLLOWING = 11;
private static final int URI_CODE_TWITTER_USER_FOLLOWERS = 12;
private static final int URI_CODE_TWITTER_USER_FAVORITES = 13;
private static final int URI_CODE_TWITTER_INTENT_TWEET = 101;
private static final int URI_CODE_TWITTER_REDIRECT = 201;
private static final int URI_CODE_TWITTER_STATUS = 1;
private static final int URI_CODE_TWITTER_USER = 2;
private static final int URI_CODE_TWITTER_USER_FOLLOWING = 11;
private static final int URI_CODE_TWITTER_USER_FOLLOWERS = 12;
private static final int URI_CODE_TWITTER_USER_FAVORITES = 13;
private static final int URI_CODE_TWITTER_USER_LIST = 14;
private static final int URI_CODE_TWITTER_USER_LIST_MEMBERS = 41;
private static final int URI_CODE_TWITTER_USER_LIST_SUBSCRIBERS = 42;
private static final int URI_CODE_TWITTER_INTENT_TWEET = 101;
private static final int URI_CODE_TWITTER_REDIRECT = 201;
static {
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/i/redirect", URI_CODE_TWITTER_REDIRECT);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/intent/tweet", URI_CODE_TWITTER_INTENT_TWEET);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/status/#", URI_CODE_TWITTER_STATUS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/status/#/photo/#", URI_CODE_TWITTER_STATUS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*", URI_CODE_TWITTER_USER);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/following", URI_CODE_TWITTER_USER_FOLLOWING);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/followers", URI_CODE_TWITTER_USER_FOLLOWERS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/favorites", URI_CODE_TWITTER_USER_FAVORITES);
}
private SharedPreferences mPreferences;
private PackageManager mPackageManager;
static {
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/i/redirect", URI_CODE_TWITTER_REDIRECT);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/intent/tweet", URI_CODE_TWITTER_INTENT_TWEET);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/status/#", URI_CODE_TWITTER_STATUS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/status/#/photo/#", URI_CODE_TWITTER_STATUS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*", URI_CODE_TWITTER_USER);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/following", URI_CODE_TWITTER_USER_FOLLOWING);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/followers", URI_CODE_TWITTER_USER_FOLLOWERS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/favorites", URI_CODE_TWITTER_USER_FAVORITES);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/*", URI_CODE_TWITTER_USER_LIST);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/*/members", URI_CODE_TWITTER_USER_LIST_MEMBERS);
URI_MATCHER.addURI(AUTHORITY_TWITTER_COM, "/*/*/subscribers", URI_CODE_TWITTER_USER_LIST_MEMBERS);
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_PICK_ACTIVITY: {
if (resultCode != RESULT_OK || data == null || !data.hasExtra(EXTRA_DATA)
|| !data.hasExtra(EXTRA_INTENT)) {
finish();
return;
}
final ResolveInfo resolveInfo = data.getParcelableExtra(EXTRA_DATA);
final Intent extraIntent = data.getParcelableExtra(EXTRA_INTENT);
final ActivityInfo activityInfo = resolveInfo.activityInfo;
if (activityInfo == null) {
finish();
return;
}
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putString(KEY_FALLBACK_TWITTER_LINK_HANDLER, activityInfo.packageName);
editor.apply();
final Intent intent = new Intent(Intent.ACTION_VIEW, extraIntent.getData());
intent.setClassName(activityInfo.packageName, activityInfo.name);
startActivity(intent);
finish();
return;
}
}
}
private SharedPreferences mPreferences;
private PackageManager mPackageManager;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPackageManager = getPackageManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
final Intent intent = getIntent();
final Uri data = intent.getData();
if (data == null) {
finish();
return;
}
final Uri uri = data.buildUpon().authority(AUTHORITY_TWITTER_COM).build();
final Intent handledIntent = getHandledIntent(uri);
if (handledIntent != null) {
startActivity(handledIntent);
} else {
final String packageName = mPreferences.getString(KEY_FALLBACK_TWITTER_LINK_HANDLER, null);
final Intent fallbackIntent = new Intent(Intent.ACTION_VIEW, uri);
fallbackIntent.setPackage(packageName);
if (TextUtils.isEmpty(packageName) || mPackageManager.queryIntentActivities(fallbackIntent, 0).isEmpty()) {
final Intent pickIntent = new Intent(INTENT_ACTION_PICK_ACTIVITY);
pickIntent.putExtra(EXTRA_INTENT, new Intent(Intent.ACTION_VIEW, uri));
pickIntent.putExtra(EXTRA_BLACKLIST, new String[] { getPackageName() });
startActivityForResult(pickIntent, REQUEST_PICK_ACTIVITY);
return;
} else {
startActivity(fallbackIntent);
}
}
finish();
}
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_PICK_ACTIVITY: {
if (resultCode != RESULT_OK || data == null || !data.hasExtra(EXTRA_DATA)
|| !data.hasExtra(EXTRA_INTENT)) {
finish();
return;
}
final ResolveInfo resolveInfo = data.getParcelableExtra(EXTRA_DATA);
final Intent extraIntent = data.getParcelableExtra(EXTRA_INTENT);
final ActivityInfo activityInfo = resolveInfo.activityInfo;
if (activityInfo == null) {
finish();
return;
}
final SharedPreferences.Editor editor = mPreferences.edit();
editor.putString(KEY_FALLBACK_TWITTER_LINK_HANDLER, activityInfo.packageName);
editor.apply();
final Intent intent = new Intent(Intent.ACTION_VIEW, extraIntent.getData());
intent.setClassName(activityInfo.packageName, activityInfo.name);
startActivity(intent);
finish();
return;
}
}
}
private Intent getHandledIntent(final Uri uri) {
final List<String> pathSegments = uri.getPathSegments();
switch (URI_MATCHER.match(uri)) {
case URI_CODE_TWITTER_STATUS: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_STATUS);
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, pathSegments.get(2));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_INTENT_TWEET: {
final Intent handledIntent = new Intent(this, ComposeActivity.class);
handledIntent.setAction(Intent.ACTION_SEND);
final String text = uri.getQueryParameter("text");
final String url = uri.getQueryParameter("url");
handledIntent.putExtra(Intent.EXTRA_TEXT, Utils.getShareStatus(this, text, url));
return handledIntent;
}
case URI_CODE_TWITTER_USER: {
final String pathSegment = pathSegments.get(0);
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
if ("share".equals(pathSegment)) {
final Intent handledIntent = new Intent(this, ComposeActivity.class);
handledIntent.setAction(Intent.ACTION_SEND);
final String text = uri.getQueryParameter("text");
final String url = uri.getQueryParameter("url");
handledIntent.putExtra(Intent.EXTRA_TEXT, Utils.getShareStatus(this, text, url));
return handledIntent;
} else if ("following".equals(pathSegment)) {
builder.authority(AUTHORITY_USER_FRIENDS);
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(getDefaultAccountId(this)));
} else if ("followers".equals(pathSegment)) {
builder.authority(AUTHORITY_USER_FOLLOWERS);
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(getDefaultAccountId(this)));
} else if ("favorites".equals(pathSegment)) {
builder.authority(AUTHORITY_USER_FAVORITES);
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(getDefaultAccountId(this)));
} else if (!ArrayUtils.contains(TWITTER_RESERVED_PATHS, pathSegment)) {
builder.authority(AUTHORITY_USER);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegment);
} else
return null;
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_FOLLOWING: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FRIENDS);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegments.get(0));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_FOLLOWERS: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FOLLOWERS);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegments.get(0));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_FAVORITES: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FAVORITES);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegments.get(0));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
}
return null;
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPackageManager = getPackageManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
final Intent intent = getIntent();
final Uri data = intent.getData();
if (data == null) {
finish();
return;
}
final Uri uri = data.buildUpon().authority(AUTHORITY_TWITTER_COM).build();
final Intent handledIntent = getHandledIntent(uri);
if (handledIntent != null) {
startActivity(handledIntent);
} else {
final String packageName = mPreferences.getString(KEY_FALLBACK_TWITTER_LINK_HANDLER, null);
final Intent fallbackIntent = new Intent(Intent.ACTION_VIEW, uri);
fallbackIntent.setPackage(packageName);
if (TextUtils.isEmpty(packageName) || mPackageManager.queryIntentActivities(fallbackIntent, 0).isEmpty()) {
final Intent pickIntent = new Intent(INTENT_ACTION_PICK_ACTIVITY);
pickIntent.putExtra(EXTRA_INTENT, new Intent(Intent.ACTION_VIEW, uri));
pickIntent.putExtra(EXTRA_BLACKLIST, new String[]{getPackageName()});
startActivityForResult(pickIntent, REQUEST_PICK_ACTIVITY);
return;
} else {
startActivity(fallbackIntent);
}
}
finish();
}
private Intent getHandledIntent(final Uri uri) {
final List<String> pathSegments = uri.getPathSegments();
switch (URI_MATCHER.match(uri)) {
case URI_CODE_TWITTER_STATUS: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_STATUS);
builder.appendQueryParameter(QUERY_PARAM_STATUS_ID, pathSegments.get(2));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_INTENT_TWEET: {
final Intent handledIntent = new Intent(this, ComposeActivity.class);
handledIntent.setAction(Intent.ACTION_SEND);
final String text = uri.getQueryParameter("text");
final String url = uri.getQueryParameter("url");
handledIntent.putExtra(Intent.EXTRA_TEXT, Utils.getShareStatus(this, text, url));
return handledIntent;
}
case URI_CODE_TWITTER_USER: {
final String pathSegment = pathSegments.get(0);
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
if ("share".equals(pathSegment)) {
final Intent handledIntent = new Intent(this, ComposeActivity.class);
handledIntent.setAction(Intent.ACTION_SEND);
final String text = uri.getQueryParameter("text");
final String url = uri.getQueryParameter("url");
handledIntent.putExtra(Intent.EXTRA_TEXT, Utils.getShareStatus(this, text, url));
return handledIntent;
} else if ("following".equals(pathSegment)) {
builder.authority(AUTHORITY_USER_FRIENDS);
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(getDefaultAccountId(this)));
} else if ("followers".equals(pathSegment)) {
builder.authority(AUTHORITY_USER_FOLLOWERS);
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(getDefaultAccountId(this)));
} else if ("favorites".equals(pathSegment)) {
builder.authority(AUTHORITY_USER_FAVORITES);
builder.appendQueryParameter(QUERY_PARAM_USER_ID, String.valueOf(getDefaultAccountId(this)));
} else if (!ArrayUtils.contains(TWITTER_RESERVED_PATHS, pathSegment)) {
builder.authority(AUTHORITY_USER);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegment);
} else
return null;
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_FOLLOWING: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FRIENDS);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegments.get(0));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_FOLLOWERS: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FOLLOWERS);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegments.get(0));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_FAVORITES: {
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_FAVORITES);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, pathSegments.get(0));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_LIST: {
final String firstSegment = pathSegments.get(0);
if (ArrayUtils.contains(TWITTER_RESERVED_PATHS, firstSegment)) {
return null;
}
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_LIST);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, firstSegment);
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments.get(1));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_LIST_MEMBERS: {
final String firstSegment = pathSegments.get(0);
if (ArrayUtils.contains(TWITTER_RESERVED_PATHS, firstSegment)) {
return null;
}
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_LIST_MEMBERS);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, firstSegment);
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments.get(1));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
case URI_CODE_TWITTER_USER_LIST_SUBSCRIBERS: {
final String firstSegment = pathSegments.get(0);
if (ArrayUtils.contains(TWITTER_RESERVED_PATHS, firstSegment)) {
return null;
}
final Uri.Builder builder = new Uri.Builder();
builder.scheme(SCHEME_TWIDERE);
builder.authority(AUTHORITY_USER_LIST_SUBSCRIBERS);
builder.appendQueryParameter(QUERY_PARAM_SCREEN_NAME, firstSegment);
builder.appendQueryParameter(QUERY_PARAM_LIST_NAME, pathSegments.get(1));
return new Intent(Intent.ACTION_VIEW, builder.build());
}
}
return null;
}
}

View File

@ -33,7 +33,7 @@ public interface IThemedActivity extends ITwidereContextWrapper {
public int getThemeBackgroundAlpha();
public int getThemeColor();
public int getOverrideAccentColor();
public TwidereMenuInflater getTwidereMenuInflater();

View File

@ -1,5 +1,6 @@
package org.mariotaku.twidere.activity.support;
import android.content.Context;
import android.content.res.Resources;
import android.support.v4.app.FragmentActivity;
@ -14,11 +15,20 @@ import com.negusoft.holoaccent.AccentResources;
*/
public class AccentFragmentActivity extends FragmentActivity {
private final AccentHelper mAccentHelper = new AccentHelper(getOverrideAccentColor(),
getOverrideAccentColorDark(), getOverrideAccentColorActionBar(), new MyInitListener());
private AccentHelper mAccentHelper;
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
mAccentHelper = new AccentHelper(getOverrideAccentColor(),
getOverrideAccentColorDark(), getOverrideAccentColorActionBar(), new MyInitListener());
}
@Override
public Resources getResources() {
if (mAccentHelper == null) {
return super.getResources();
}
return mAccentHelper.getResources(this, super.getResources());
}

View File

@ -41,8 +41,8 @@ public class BaseSupportActivity extends BaseSupportThemedActivity implements Co
}
@Override
public int getThemeColor() {
return ThemeUtils.getUserThemeColor(this);
public int getOverrideAccentColor() {
return ThemeUtils.getUserThemeColor(this, getThemeResourceId());
}
@Override

View File

@ -45,8 +45,8 @@ public class BaseSupportDialogActivity extends BaseSupportThemedActivity impleme
}
@Override
public int getThemeColor() {
return ThemeUtils.getThemeColor(this);
public int getOverrideAccentColor() {
return ThemeUtils.getThemeColor(this, getThemeResourceId());
}
@Override

View File

@ -77,7 +77,7 @@ public abstract class BaseSupportThemedActivity extends AccentFragmentActivity i
}
@Override
public abstract int getThemeColor();
public abstract int getOverrideAccentColor();
@Override
@ -156,7 +156,7 @@ public abstract class BaseSupportThemedActivity extends AccentFragmentActivity i
private final void setTheme() {
mCurrentThemeResource = getThemeResourceId();
mCurrentThemeColor = getThemeColor();
mCurrentThemeColor = getOverrideAccentColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
ThemeUtils.notifyStatusBarColorChanged(this, mCurrentThemeResource, mCurrentThemeColor,
mCurrentThemeBackgroundAlpha);

View File

@ -212,7 +212,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
}
@Override
public int getThemeColor() {
public int getOverrideAccentColor() {
return ThemeUtils.getUserThemeColor(this);
}
@ -240,7 +240,7 @@ public class ComposeActivity extends BaseSupportDialogActivity implements TextWa
} else {
mLocationManager.removeUpdates(this);
}
mPreferences.edit().putBoolean(KEY_ATTACH_LOCATION, !attachLocation).commit();
mPreferences.edit().putBoolean(KEY_ATTACH_LOCATION, !attachLocation).apply();
setMenu();
updateTextCount();
break;

View File

@ -45,7 +45,7 @@ public class ImagePickerActivity extends BaseSupportThemedActivity {
private Runnable mImageSelectedRunnable;
@Override
public int getThemeColor() {
public int getOverrideAccentColor() {
return 0;
}

View File

@ -19,53 +19,54 @@ import org.mariotaku.menucomponent.internal.menu.MenuAdapter;
import org.mariotaku.menucomponent.internal.menu.MenuUtils;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.fragment.support.BaseSupportDialogFragment;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.util.ThemeUtils;
public abstract class MenuDialogFragment extends BaseSupportDialogFragment implements OnItemClickListener {
private Context mThemedContext;
private Context mThemedContext;
public Context getThemedContext() {
if (mThemedContext != null) return mThemedContext;
final FragmentActivity activity = getActivity();
final int themeRes, accentColor;
if (activity instanceof IThemedActivity) {
themeRes = ((IThemedActivity) activity).getThemeResourceId();
accentColor = ((IThemedActivity) activity).getThemeColor();
} else {
themeRes = ThemeUtils.getSettingsThemeResource(activity);
accentColor = ThemeUtils.getUserThemeColor(activity);
}
return mThemedContext = ThemeUtils.getThemedContextForActionIcons(activity, themeRes, accentColor);
}
public Context getThemedContext() {
if (mThemedContext != null) return mThemedContext;
final FragmentActivity activity = getActivity();
final int themeRes, accentColor;
if (activity instanceof IThemedActivity) {
themeRes = ((IThemedActivity) activity).getThemeResourceId();
accentColor = ((IThemedActivity) activity).getOverrideAccentColor();
} else {
themeRes = ThemeUtils.getSettingsThemeResource(activity);
accentColor = ThemeUtils.getUserThemeColor(activity);
}
return mThemedContext = ThemeUtils.getThemedContextForActionIcons(activity, themeRes, accentColor);
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Context context = getThemedContext();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
final MenuAdapter adapter = new MenuAdapter(context);
final ListView listView = new ListView(context);
listView.setAdapter(adapter);
listView.setOnItemClickListener(this);
builder.setView(listView);
final Menu menu = MenuUtils.createMenu(context);
onCreateMenu(new MenuInflater(context), menu);
adapter.setMenu(menu);
return builder.create();
}
@Override
public Dialog onCreateDialog(final Bundle savedInstanceState) {
final Context context = getThemedContext();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
final MenuAdapter adapter = new MenuAdapter(context);
final ListView listView = new ListView(context);
listView.setAdapter(adapter);
listView.setOnItemClickListener(this);
builder.setView(listView);
final Menu menu = MenuUtils.createMenu(context);
onCreateMenu(new TwidereMenuInflater(context), menu);
adapter.setMenu(menu);
return builder.create();
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final Fragment parentFragment = getParentFragment();
final MenuItem item = (MenuItem) parent.getItemAtPosition(position);
if (item.hasSubMenu()) {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final Fragment parentFragment = getParentFragment();
final MenuItem item = (MenuItem) parent.getItemAtPosition(position);
if (item.hasSubMenu()) {
} else if (parentFragment instanceof OnMenuItemClickListener) {
((OnMenuItemClickListener) parentFragment).onMenuItemClick(item);
dismiss();
}
}
} else if (parentFragment instanceof OnMenuItemClickListener) {
((OnMenuItemClickListener) parentFragment).onMenuItemClick(item);
dismiss();
}
}
protected abstract void onCreateMenu(MenuInflater inflater, Menu menu);
protected abstract void onCreateMenu(TwidereMenuInflater inflater, Menu menu);
}

View File

@ -63,6 +63,7 @@ public class AccountsAdapter extends SimpleCursorAdapter implements Constants {
if (mDisplayProfileImage) {
mImageLoader.displayProfileImage(holder.profile_image, cursor.getString(mProfileImageIdx));
} else {
mImageLoader.cancelDisplayTask(holder.profile_image);
holder.profile_image.setImageResource(R.drawable.ic_profile_image_default);
}
final boolean isMultipleChoice = mChoiceMode == ListView.CHOICE_MODE_MULTIPLE

View File

@ -77,6 +77,7 @@ public class AccountsSpinnerAdapter extends ArrayAdapter<Account> {
if (mDisplayProfileImage) {
mImageLoader.displayProfileImage(icon, item.profile_image_url);
} else {
mImageLoader.cancelDisplayTask(icon);
icon.setImageResource(R.drawable.ic_profile_image_default);
}
} else {

View File

@ -217,6 +217,7 @@ public abstract class BaseParcelableActivitiesAdapter extends BaseArrayAdapter<P
view.setVisibility(View.VISIBLE);
mImageLoader.displayProfileImage(view, urls[i]);
} else {
mImageLoader.cancelDisplayTask(view);
view.setVisibility(View.GONE);
}
}

View File

@ -19,17 +19,6 @@
package org.mariotaku.twidere.adapter;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserColor;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserNickname;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.findStatusInDatabases;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getCardHighlightColor;
import static org.mariotaku.twidere.util.Utils.getCardHighlightOptionInt;
import static org.mariotaku.twidere.util.Utils.isFiltered;
import static org.mariotaku.twidere.util.Utils.openImage;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
@ -59,438 +48,454 @@ import org.mariotaku.twidere.view.iface.ICardItemView.OnOverflowIconClickListene
import java.util.Locale;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserColor;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserNickname;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.findStatusInDatabases;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getCardHighlightColor;
import static org.mariotaku.twidere.util.Utils.getCardHighlightOptionInt;
import static org.mariotaku.twidere.util.Utils.isFiltered;
import static org.mariotaku.twidere.util.Utils.openImage;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
public class CursorStatusesAdapter extends BaseCursorAdapter implements IStatusesAdapter<Cursor>, OnClickListener,
OnOverflowIconClickListener {
OnOverflowIconClickListener {
public static final String[] CURSOR_COLS = Statuses.COLUMNS;
public static final String[] CURSOR_COLS = Statuses.COLUMNS;
private final Context mContext;
private final ImageLoaderWrapper mImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final SQLiteDatabase mDatabase;
private final ImageLoadingHandler mImageLoadingHandler;
private final Context mContext;
private final ImageLoaderWrapper mImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final SQLiteDatabase mDatabase;
private final ImageLoadingHandler mImageLoadingHandler;
private MenuButtonClickListener mListener;
private MenuButtonClickListener mListener;
private final boolean mPlainList;
private final boolean mPlainList;
private boolean mDisplayImagePreview, mGapDisallowed, mMentionsHighlightDisabled, mFavoritesHighlightDisabled,
mDisplaySensitiveContents, mIndicateMyStatusDisabled, mIsLastItemFiltered, mFiltersEnabled,
mAnimationEnabled;
private boolean mFilterIgnoreUser, mFilterIgnoreSource, mFilterIgnoreTextHtml, mFilterIgnoreTextPlain,
mFilterRetweetedById;
private int mMaxAnimationPosition, mCardHighlightOption;
private boolean mDisplayImagePreview, mGapDisallowed, mMentionsHighlightDisabled, mFavoritesHighlightDisabled,
mDisplaySensitiveContents, mIndicateMyStatusDisabled, mIsLastItemFiltered, mFiltersEnabled,
mAnimationEnabled;
private boolean mFilterIgnoreUser, mFilterIgnoreSource, mFilterIgnoreTextHtml, mFilterIgnoreTextPlain,
mFilterRetweetedById;
private int mMaxAnimationPosition, mCardHighlightOption;
private ParcelableStatus.CursorIndices mIndices;
private ParcelableStatus.CursorIndices mIndices;
private ScaleType mImagePreviewScaleType;
private ScaleType mImagePreviewScaleType;
public CursorStatusesAdapter(final Context context) {
this(context, Utils.isCompactCards(context), Utils.isPlainListStyle(context));
}
public CursorStatusesAdapter(final Context context) {
this(context, Utils.isCompactCards(context), Utils.isPlainListStyle(context));
}
public CursorStatusesAdapter(final Context context, final boolean compactCards, final boolean plainList) {
super(context, getItemResource(compactCards), null, new String[0], new int[0], 0);
mPlainList = plainList;
mContext = context;
final TwidereApplication application = TwidereApplication.getInstance(context);
mMultiSelectManager = application.getMultiSelectManager();
mImageLoader = application.getImageLoaderWrapper();
mDatabase = application.getSQLiteDatabase();
mImageLoadingHandler = new ImageLoadingHandler();
configBaseCardAdapter(context, this);
setMaxAnimationPosition(-1);
}
public CursorStatusesAdapter(final Context context, final boolean compactCards, final boolean plainList) {
super(context, getItemResource(compactCards), null, new String[0], new int[0], 0);
mPlainList = plainList;
mContext = context;
final TwidereApplication application = TwidereApplication.getInstance(context);
mMultiSelectManager = application.getMultiSelectManager();
mImageLoader = application.getImageLoaderWrapper();
mDatabase = application.getSQLiteDatabase();
mImageLoadingHandler = new ImageLoadingHandler();
configBaseCardAdapter(context, this);
setMaxAnimationPosition(-1);
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final int position = cursor.getPosition();
final StatusViewHolder holder = (StatusViewHolder) view.getTag();
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final int position = cursor.getPosition();
final StatusViewHolder holder = (StatusViewHolder) view.getTag();
final boolean isGap = cursor.getShort(mIndices.is_gap) == 1;
final boolean showGap = isGap && !mGapDisallowed && position != getCount() - 1;
final boolean isGap = cursor.getShort(mIndices.is_gap) == 1;
final boolean showGap = isGap && !mGapDisallowed && position != getCount() - 1;
holder.setShowAsGap(showGap);
holder.position = position;
holder.setDisplayProfileImage(isDisplayProfileImage());
holder.setCardHighlightOption(mCardHighlightOption);
holder.setShowAsGap(showGap);
holder.position = position;
holder.setDisplayProfileImage(isDisplayProfileImage());
holder.setCardHighlightOption(mCardHighlightOption);
if (!showGap) {
if (!showGap) {
// Clear images in prder to prevent images in recycled view shown.
holder.profile_image.setImageDrawable(null);
holder.my_profile_image.setImageDrawable(null);
holder.image_preview.setImageDrawable(null);
// Clear images in prder to prevent images in recycled view shown.
final TwidereLinkify linkify = getLinkify();
final boolean showAccountColor = isShowAccountColor();
final TwidereLinkify linkify = getLinkify();
final boolean showAccountColor = isShowAccountColor();
final long accountId = cursor.getLong(mIndices.account_id);
final long userId = cursor.getLong(mIndices.user_id);
final long timestamp = cursor.getLong(mIndices.status_timestamp);
final long retweetTimestamp = cursor.getLong(mIndices.retweet_timestamp);
final long retweetCount = cursor.getLong(mIndices.retweet_count);
final long retweetedByUserId = cursor.getLong(mIndices.retweeted_by_user_id);
final long inReplyToUserId = cursor.getLong(mIndices.in_reply_to_user_id);
final long accountId = cursor.getLong(mIndices.account_id);
final long userId = cursor.getLong(mIndices.user_id);
final long timestamp = cursor.getLong(mIndices.status_timestamp);
final long retweetTimestamp = cursor.getLong(mIndices.retweet_timestamp);
final long retweetCount = cursor.getLong(mIndices.retweet_count);
final long retweetedByUserId = cursor.getLong(mIndices.retweeted_by_user_id);
final long inReplyToUserId = cursor.getLong(mIndices.in_reply_to_user_id);
final String retweetedByName = cursor.getString(mIndices.retweeted_by_user_name);
final String retweetedByScreenName = cursor.getString(mIndices.retweeted_by_user_screen_name);
final String text = getLinkHighlightOption() != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE ? cursor
.getString(mIndices.text_html) : cursor.getString(mIndices.text_unescaped);
final String screen_name = cursor.getString(mIndices.user_screen_name);
final String name = cursor.getString(mIndices.user_name);
final String inReplyToName = cursor.getString(mIndices.in_reply_to_user_name);
final String inReplyToScreenName = cursor.getString(mIndices.in_reply_to_user_screen_name);
final ParcelableMedia[] medias = ParcelableMedia.fromJSONString(cursor.getString(mIndices.medias));
final String firstMedia = medias != null && medias.length > 0 ? medias[0].media_url : null;
final String retweetedByName = cursor.getString(mIndices.retweeted_by_user_name);
final String retweetedByScreenName = cursor.getString(mIndices.retweeted_by_user_screen_name);
final String text = getLinkHighlightOption() != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE ? cursor
.getString(mIndices.text_html) : cursor.getString(mIndices.text_unescaped);
final String screen_name = cursor.getString(mIndices.user_screen_name);
final String name = cursor.getString(mIndices.user_name);
final String inReplyToName = cursor.getString(mIndices.in_reply_to_user_name);
final String inReplyToScreenName = cursor.getString(mIndices.in_reply_to_user_screen_name);
final ParcelableMedia[] medias = ParcelableMedia.fromJSONString(cursor.getString(mIndices.medias));
final String firstMedia = medias != null && medias.length > 0 ? medias[0].media_url : null;
// Tweet type (favorite/location/media)
final boolean isFavorite = cursor.getShort(mIndices.is_favorite) == 1;
final boolean hasLocation = !TextUtils.isEmpty(cursor.getString(mIndices.location));
final boolean possiblySensitive = cursor.getInt(mIndices.is_possibly_sensitive) == 1;
final boolean hasMedia = medias != null && medias.length > 0;
// Tweet type (favorite/location/media)
final boolean isFavorite = cursor.getShort(mIndices.is_favorite) == 1;
final boolean hasLocation = !TextUtils.isEmpty(cursor.getString(mIndices.location));
final boolean possiblySensitive = cursor.getInt(mIndices.is_possibly_sensitive) == 1;
final boolean hasMedia = medias != null && medias.length > 0;
// User type (protected/verified)
final boolean isVerified = cursor.getShort(mIndices.is_verified) == 1;
final boolean isProtected = cursor.getShort(mIndices.is_protected) == 1;
// User type (protected/verified)
final boolean isVerified = cursor.getShort(mIndices.is_verified) == 1;
final boolean isProtected = cursor.getShort(mIndices.is_protected) == 1;
final boolean isRetweet = cursor.getShort(mIndices.is_retweet) == 1;
final boolean isReply = cursor.getLong(mIndices.in_reply_to_status_id) > 0;
final boolean isMention = ParcelableUserMention.hasMention(cursor.getString(mIndices.mentions), accountId);
final boolean isMyStatus = accountId == userId;
final boolean isRetweet = cursor.getShort(mIndices.is_retweet) == 1;
final boolean isReply = cursor.getLong(mIndices.in_reply_to_status_id) > 0;
final boolean isMention = ParcelableUserMention.hasMention(cursor.getString(mIndices.mentions), accountId);
final boolean isMyStatus = accountId == userId;
holder.setUserColor(getUserColor(mContext, userId));
if (isRetweet) {
holder.setUserColor(getUserColor(mContext, userId), getUserColor(mContext, retweetedByUserId));
} else {
holder.setUserColor(getUserColor(mContext, userId));
}
holder.setHighlightColor(getCardHighlightColor(!mMentionsHighlightDisabled && isMention,
!mFavoritesHighlightDisabled && isFavorite, isRetweet));
holder.setUserColor(getUserColor(mContext, userId));
if (isRetweet) {
holder.setUserColor(getUserColor(mContext, userId), getUserColor(mContext, retweetedByUserId));
} else {
holder.setUserColor(getUserColor(mContext, userId));
}
holder.setHighlightColor(getCardHighlightColor(!mMentionsHighlightDisabled && isMention,
!mFavoritesHighlightDisabled && isFavorite, isRetweet));
holder.setAccountColorEnabled(showAccountColor);
holder.setAccountColorEnabled(showAccountColor);
if (showAccountColor) {
holder.setAccountColor(getAccountColor(mContext, accountId));
}
if (showAccountColor) {
holder.setAccountColor(getAccountColor(mContext, accountId));
}
holder.setTextSize(getTextSize());
holder.setTextSize(getTextSize());
holder.setIsMyStatus(isMyStatus && !mIndicateMyStatusDisabled);
if (getLinkHighlightOption() != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
holder.text.setText(Html.fromHtml(text));
linkify.applyAllLinks(holder.text, accountId, possiblySensitive);
holder.text.setMovementMethod(null);
} else {
holder.text.setText(text);
}
holder.setUserType(isVerified, isProtected);
holder.setDisplayNameFirst(isDisplayNameFirst());
holder.setNicknameOnly(isNicknameOnly());
final String nick = getUserNickname(context, userId);
holder.name.setText(TextUtils.isEmpty(nick) ? name : isNicknameOnly() ? nick : context.getString(
R.string.name_with_nickname, name, nick));
holder.screen_name.setText("@" + screen_name);
if (getLinkHighlightOption() != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
linkify.applyUserProfileLinkNoHighlight(holder.name, accountId, userId, screen_name);
linkify.applyUserProfileLinkNoHighlight(holder.screen_name, accountId, userId, screen_name);
holder.name.setMovementMethod(null);
holder.screen_name.setMovementMethod(null);
}
holder.time.setTime(retweetTimestamp > 0 ? retweetTimestamp : timestamp);
holder.setStatusType(!mFavoritesHighlightDisabled && isFavorite, hasLocation, hasMedia, possiblySensitive);
holder.setIsMyStatus(isMyStatus && !mIndicateMyStatusDisabled);
if (getLinkHighlightOption() != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
holder.text.setText(Html.fromHtml(text));
linkify.applyAllLinks(holder.text, accountId, possiblySensitive);
holder.text.setMovementMethod(null);
} else {
holder.text.setText(text);
}
holder.setUserType(isVerified, isProtected);
holder.setDisplayNameFirst(isDisplayNameFirst());
holder.setNicknameOnly(isNicknameOnly());
final String nick = getUserNickname(context, userId);
holder.name.setText(TextUtils.isEmpty(nick) ? name : isNicknameOnly() ? nick : context.getString(
R.string.name_with_nickname, name, nick));
holder.screen_name.setText("@" + screen_name);
if (getLinkHighlightOption() != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
linkify.applyUserProfileLinkNoHighlight(holder.name, accountId, userId, screen_name);
linkify.applyUserProfileLinkNoHighlight(holder.screen_name, accountId, userId, screen_name);
holder.name.setMovementMethod(null);
holder.screen_name.setMovementMethod(null);
}
holder.time.setTime(retweetTimestamp > 0 ? retweetTimestamp : timestamp);
holder.setStatusType(!mFavoritesHighlightDisabled && isFavorite, hasLocation, hasMedia, possiblySensitive);
holder.setIsReplyRetweet(isReply, isRetweet);
if (isRetweet) {
holder.setRetweetedBy(retweetCount, retweetedByUserId, retweetedByName, retweetedByScreenName);
} else if (isReply) {
holder.setReplyTo(inReplyToUserId, inReplyToName, inReplyToScreenName);
}
holder.setIsReplyRetweet(isReply, isRetweet);
if (isRetweet) {
holder.setRetweetedBy(retweetCount, retweetedByUserId, retweetedByName, retweetedByScreenName);
} else if (isReply) {
holder.setReplyTo(inReplyToUserId, inReplyToName, inReplyToScreenName);
}
if (isDisplayProfileImage()) {
final String profile_image_url = cursor.getString(mIndices.user_profile_image_url);
mImageLoader.displayProfileImage(holder.my_profile_image, profile_image_url);
mImageLoader.displayProfileImage(holder.profile_image, profile_image_url);
holder.profile_image.setTag(position);
holder.my_profile_image.setTag(position);
} else {
holder.profile_image.setVisibility(View.GONE);
holder.my_profile_image.setVisibility(View.GONE);
}
final boolean hasPreview = mDisplayImagePreview && hasMedia;
holder.image_preview_container.setVisibility(hasPreview ? View.VISIBLE : View.GONE);
if (hasPreview && firstMedia != null && medias != null) {
if (mImagePreviewScaleType != null) {
holder.image_preview.setScaleType(mImagePreviewScaleType);
}
if (possiblySensitive && !mDisplaySensitiveContents) {
holder.image_preview.setImageDrawable(null);
holder.image_preview.setBackgroundResource(R.drawable.image_preview_nsfw);
holder.image_preview_progress.setVisibility(View.GONE);
} else if (!firstMedia.equals(mImageLoadingHandler.getLoadingUri(holder.image_preview))) {
holder.image_preview.setBackgroundResource(0);
mImageLoader.displayPreviewImage(holder.image_preview, firstMedia, mImageLoadingHandler);
}
final Resources res = mContext.getResources();
final int count = medias.length;
holder.image_preview_count.setText(res.getQuantityString(R.plurals.N_medias, count, count));
holder.image_preview.setTag(position);
}
}
}
if (isDisplayProfileImage()) {
final String profile_image_url = cursor.getString(mIndices.user_profile_image_url);
mImageLoader.displayProfileImage(holder.my_profile_image, profile_image_url);
mImageLoader.displayProfileImage(holder.profile_image, profile_image_url);
holder.profile_image.setTag(position);
holder.my_profile_image.setTag(position);
} else {
mImageLoader.cancelDisplayTask(holder.profile_image);
mImageLoader.cancelDisplayTask(holder.my_profile_image);
holder.profile_image.setVisibility(View.GONE);
holder.my_profile_image.setVisibility(View.GONE);
}
final boolean hasPreview = mDisplayImagePreview && hasMedia;
holder.image_preview_container.setVisibility(hasPreview ? View.VISIBLE : View.GONE);
if (hasPreview && firstMedia != null && medias != null) {
if (mImagePreviewScaleType != null) {
holder.image_preview.setScaleType(mImagePreviewScaleType);
}
if (possiblySensitive && !mDisplaySensitiveContents) {
holder.image_preview.setImageDrawable(null);
holder.image_preview.setBackgroundResource(R.drawable.image_preview_nsfw);
holder.image_preview_progress.setVisibility(View.GONE);
} else if (!firstMedia.equals(mImageLoadingHandler.getLoadingUri(holder.image_preview))) {
holder.image_preview.setBackgroundResource(0);
mImageLoader.displayPreviewImage(holder.image_preview, firstMedia, mImageLoadingHandler);
}
final Resources res = mContext.getResources();
final int count = medias.length;
holder.image_preview_count.setText(res.getQuantityString(R.plurals.N_medias, count, count));
holder.image_preview.setTag(position);
} else {
mImageLoader.cancelDisplayTask(holder.image_preview);
}
} else {
mImageLoader.cancelDisplayTask(holder.profile_image);
mImageLoader.cancelDisplayTask(holder.my_profile_image);
mImageLoader.cancelDisplayTask(holder.image_preview);
}
}
@Override
public int findPositionByStatusId(final long status_id) {
final Cursor c = getCursor();
if (c == null || c.isClosed()) return -1;
for (int i = 0, count = c.getCount(); i < count; i++) {
if (c.moveToPosition(i) && c.getLong(mIndices.status_id) == status_id) return i;
}
return -1;
}
@Override
public int findPositionByStatusId(final long status_id) {
final Cursor c = getCursor();
if (c == null || c.isClosed()) return -1;
for (int i = 0, count = c.getCount(); i < count; i++) {
if (c.moveToPosition(i) && c.getLong(mIndices.status_id) == status_id) return i;
}
return -1;
}
@Override
public long getAccountId(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return -1;
return c.getLong(mIndices.account_id);
}
@Override
public long getAccountId(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return -1;
return c.getLong(mIndices.account_id);
}
@Override
public int getActualCount() {
return super.getCount();
}
@Override
public int getActualCount() {
return super.getCount();
}
@Override
public int getCount() {
final int count = super.getCount();
return mFiltersEnabled && mIsLastItemFiltered && count > 0 ? count - 1 : count;
}
@Override
public int getCount() {
final int count = super.getCount();
return mFiltersEnabled && mIsLastItemFiltered && count > 0 ? count - 1 : count;
}
@Override
public ParcelableStatus getLastStatus() {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToLast()) return null;
final long account_id = c.getLong(mIndices.account_id);
final long status_id = c.getLong(mIndices.status_id);
return findStatusInDatabases(mContext, account_id, status_id);
}
@Override
public ParcelableStatus getLastStatus() {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToLast()) return null;
final long account_id = c.getLong(mIndices.account_id);
final long status_id = c.getLong(mIndices.status_id);
return findStatusInDatabases(mContext, account_id, status_id);
}
@Override
public long getLastStatusId() {
final Cursor c = getCursor();
try {
if (c == null || c.isClosed() || !c.moveToLast()) return -1;
return c.getLong(mIndices.status_id);
} catch (final IllegalStateException e) {
return -1;
}
}
@Override
public long getLastStatusId() {
final Cursor c = getCursor();
try {
if (c == null || c.isClosed() || !c.moveToLast()) return -1;
return c.getLong(mIndices.status_id);
} catch (final IllegalStateException e) {
return -1;
}
}
@Override
public ParcelableStatus getStatus(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return null;
return new ParcelableStatus(c, mIndices);
}
@Override
public ParcelableStatus getStatus(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return null;
return new ParcelableStatus(c, mIndices);
}
@Override
public long getStatusId(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return -1;
return c.getLong(mIndices.status_id);
}
@Override
public long getStatusId(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed() || !c.moveToPosition(position)) return -1;
return c.getLong(mIndices.status_id);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
// animate the item
if (tag instanceof StatusViewHolder && position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(((StatusViewHolder) tag).item_animation);
}
mMaxAnimationPosition = position;
}
return view;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
// animate the item
if (tag instanceof StatusViewHolder && position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(((StatusViewHolder) tag).item_animation);
}
mMaxAnimationPosition = position;
}
return view;
}
@Override
public boolean isLastItemFiltered() {
return mFiltersEnabled && mIsLastItemFiltered;
}
@Override
public boolean isLastItemFiltered() {
return mFiltersEnabled && mIsLastItemFiltered;
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final View view = super.newView(context, cursor, parent);
final Object tag = view.getTag();
if (!(tag instanceof StatusViewHolder)) {
final StatusViewHolder holder = new StatusViewHolder(view);
holder.profile_image.setOnClickListener(this);
holder.my_profile_image.setOnClickListener(this);
holder.image_preview.setOnClickListener(this);
holder.content.setOnOverflowIconClickListener(this);
if (mPlainList) {
((View) holder.content).setPadding(0, 0, 0, 0);
holder.content.setItemBackground(null);
}
view.setTag(holder);
}
return view;
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final View view = super.newView(context, cursor, parent);
final Object tag = view.getTag();
if (!(tag instanceof StatusViewHolder)) {
final StatusViewHolder holder = new StatusViewHolder(view);
holder.profile_image.setOnClickListener(this);
holder.my_profile_image.setOnClickListener(this);
holder.image_preview.setOnClickListener(this);
holder.content.setOnOverflowIconClickListener(this);
if (mPlainList) {
((View) holder.content).setPadding(0, 0, 0, 0);
holder.content.setItemBackground(null);
}
view.setTag(holder);
}
return view;
}
@Override
public void onClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
final int position = tag instanceof Integer ? (Integer) tag : -1;
if (position == -1) return;
switch (view.getId()) {
case R.id.image_preview: {
final ParcelableStatus status = getStatus(position);
if (status == null || status.first_media == null) return;
openImage(mContext, status.account_id, status.first_media, status.is_possibly_sensitive);
break;
}
case R.id.my_profile_image:
case R.id.profile_image: {
final ParcelableStatus status = getStatus(position);
if (status == null) return;
if (mContext instanceof Activity) {
openUserProfile((Activity) mContext, status.account_id, status.user_id, status.user_screen_name);
}
break;
}
}
}
@Override
public void onClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
final int position = tag instanceof Integer ? (Integer) tag : -1;
if (position == -1) return;
switch (view.getId()) {
case R.id.image_preview: {
final ParcelableStatus status = getStatus(position);
if (status == null || status.first_media == null) return;
openImage(mContext, status.account_id, status.first_media, status.is_possibly_sensitive);
break;
}
case R.id.my_profile_image:
case R.id.profile_image: {
final ParcelableStatus status = getStatus(position);
if (status == null) return;
if (mContext instanceof Activity) {
openUserProfile((Activity) mContext, status.account_id, status.user_id, status.user_screen_name);
}
break;
}
}
}
@Override
public void onOverflowIconClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
if (tag instanceof StatusViewHolder) {
final StatusViewHolder holder = (StatusViewHolder) tag;
final int position = holder.position;
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
}
}
@Override
public void onOverflowIconClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
if (tag instanceof StatusViewHolder) {
final StatusViewHolder holder = (StatusViewHolder) tag;
final int position = holder.position;
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
}
}
@Override
public void setAnimationEnabled(final boolean anim) {
mAnimationEnabled = anim;
}
@Override
public void setAnimationEnabled(final boolean anim) {
mAnimationEnabled = anim;
}
@Override
public void setCardHighlightOption(final String option) {
mCardHighlightOption = getCardHighlightOptionInt(option);
}
@Override
public void setCardHighlightOption(final String option) {
mCardHighlightOption = getCardHighlightOptionInt(option);
}
@Override
public void setData(final Cursor data) {
swapCursor(data);
}
@Override
public void setData(final Cursor data) {
swapCursor(data);
}
@Override
public void setDisplayImagePreview(final boolean display) {
mDisplayImagePreview = display;
}
@Override
public void setDisplayImagePreview(final boolean display) {
mDisplayImagePreview = display;
}
@Override
public void setDisplaySensitiveContents(final boolean display) {
mDisplaySensitiveContents = display;
}
@Override
public void setDisplaySensitiveContents(final boolean display) {
mDisplaySensitiveContents = display;
}
@Override
public void setFavoritesHightlightDisabled(final boolean disable) {
mFavoritesHighlightDisabled = disable;
}
@Override
public void setFavoritesHightlightDisabled(final boolean disable) {
mFavoritesHighlightDisabled = disable;
}
@Override
public void setFiltersEnabled(final boolean enabled) {
if (mFiltersEnabled == enabled) return;
mFiltersEnabled = enabled;
rebuildFilterInfo(getCursor(), mIndices);
}
@Override
public void setFiltersEnabled(final boolean enabled) {
if (mFiltersEnabled == enabled) return;
mFiltersEnabled = enabled;
rebuildFilterInfo(getCursor(), mIndices);
}
@Override
public void setGapDisallowed(final boolean disallowed) {
mGapDisallowed = disallowed;
}
@Override
public void setGapDisallowed(final boolean disallowed) {
mGapDisallowed = disallowed;
}
@Override
public void setHighlightKeyword(final String... keywords) {
// TODO Auto-generated method stub
@Override
public void setHighlightKeyword(final String... keywords) {
// TODO Auto-generated method stub
}
}
@Override
public void setIgnoredFilterFields(final boolean user, final boolean textPlain, final boolean textHtml,
final boolean source, final boolean retweetedById) {
mFilterIgnoreTextPlain = textPlain;
mFilterIgnoreTextHtml = textHtml;
mFilterIgnoreUser = user;
mFilterIgnoreSource = source;
mFilterRetweetedById = retweetedById;
rebuildFilterInfo(getCursor(), mIndices);
}
@Override
public void setIgnoredFilterFields(final boolean user, final boolean textPlain, final boolean textHtml,
final boolean source, final boolean retweetedById) {
mFilterIgnoreTextPlain = textPlain;
mFilterIgnoreTextHtml = textHtml;
mFilterIgnoreUser = user;
mFilterIgnoreSource = source;
mFilterRetweetedById = retweetedById;
rebuildFilterInfo(getCursor(), mIndices);
}
@Override
public void setImagePreviewScaleType(final String scaleTypeString) {
final ScaleType scaleType = ScaleType.valueOf(scaleTypeString.toUpperCase(Locale.US));
mImagePreviewScaleType = scaleType;
}
@Override
public void setImagePreviewScaleType(final String scaleTypeString) {
final ScaleType scaleType = ScaleType.valueOf(scaleTypeString.toUpperCase(Locale.US));
mImagePreviewScaleType = scaleType;
}
@Override
public void setIndicateMyStatusDisabled(final boolean disable) {
mIndicateMyStatusDisabled = disable;
}
@Override
public void setIndicateMyStatusDisabled(final boolean disable) {
mIndicateMyStatusDisabled = disable;
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMentionsHightlightDisabled(final boolean disable) {
mMentionsHighlightDisabled = disable;
}
@Override
public void setMentionsHightlightDisabled(final boolean disable) {
mMentionsHighlightDisabled = disable;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
@Override
public Cursor swapCursor(final Cursor cursor) {
mIndices = cursor != null ? new ParcelableStatus.CursorIndices(cursor) : null;
rebuildFilterInfo(cursor, mIndices);
return super.swapCursor(cursor);
}
@Override
public Cursor swapCursor(final Cursor cursor) {
mIndices = cursor != null ? new ParcelableStatus.CursorIndices(cursor) : null;
rebuildFilterInfo(cursor, mIndices);
return super.swapCursor(cursor);
}
private void rebuildFilterInfo(final Cursor c, final ParcelableStatus.CursorIndices i) {
if (i != null && c != null && moveCursorToLast(c)) {
final long userId = mFilterIgnoreUser ? -1 : c.getLong(mIndices.user_id);
final String textPlain = mFilterIgnoreTextPlain ? null : c.getString(mIndices.text_plain);
final String textHtml = mFilterIgnoreTextHtml ? null : c.getString(mIndices.text_html);
final String source = mFilterIgnoreSource ? null : c.getString(mIndices.source);
final long retweetedById = mFilterRetweetedById ? -1 : c.getLong(mIndices.retweeted_by_user_id);
mIsLastItemFiltered = isFiltered(mDatabase, userId, textPlain, textHtml, source, retweetedById);
} else {
mIsLastItemFiltered = false;
}
}
private void rebuildFilterInfo(final Cursor c, final ParcelableStatus.CursorIndices i) {
if (i != null && c != null && moveCursorToLast(c)) {
final long userId = mFilterIgnoreUser ? -1 : c.getLong(mIndices.user_id);
final String textPlain = mFilterIgnoreTextPlain ? null : c.getString(mIndices.text_plain);
final String textHtml = mFilterIgnoreTextHtml ? null : c.getString(mIndices.text_html);
final String source = mFilterIgnoreSource ? null : c.getString(mIndices.source);
final long retweetedById = mFilterRetweetedById ? -1 : c.getLong(mIndices.retweeted_by_user_id);
mIsLastItemFiltered = isFiltered(mDatabase, userId, textPlain, textHtml, source, retweetedById);
} else {
mIsLastItemFiltered = false;
}
}
private static int getItemResource(final boolean compactCards) {
return compactCards ? R.layout.card_item_status_compact : R.layout.card_item_status;
}
private static int getItemResource(final boolean compactCards) {
return compactCards ? R.layout.card_item_status_compact : R.layout.card_item_status;
}
private static boolean moveCursorToLast(final Cursor c) {
if (c == null || c.isClosed()) return false;
try {
return c.moveToNext();
} catch (final Exception e) {
return false;
}
}
private static boolean moveCursorToLast(final Cursor c) {
if (c == null || c.isClosed()) return false;
try {
return c.moveToNext();
} catch (final Exception e) {
return false;
}
}
}

View File

@ -52,7 +52,7 @@ import org.mariotaku.twidere.view.holder.DirectMessageEntryViewHolder;
public class DirectMessageConversationEntriesAdapter extends BaseCursorAdapter implements IBaseCardAdapter,
OnClickListener {
private final ImageLoaderWrapper mLazyImageLoader;
private final ImageLoaderWrapper mImageLoader;
private final MultiSelectManager mMultiSelectManager;
private boolean mAnimationEnabled;
@ -70,7 +70,7 @@ public class DirectMessageConversationEntriesAdapter extends BaseCursorAdapter i
mPlainList = plainList;
final TwidereApplication app = TwidereApplication.getInstance(context);
mMultiSelectManager = app.getMultiSelectManager();
mLazyImageLoader = app.getImageLoaderWrapper();
mImageLoader = app.getImageLoaderWrapper();
configBaseCardAdapter(context, this);
}
@ -94,9 +94,6 @@ public class DirectMessageConversationEntriesAdapter extends BaseCursorAdapter i
holder.setAccountColor(getAccountColor(mContext, accountId));
}
// Clear images in prder to prevent images in recycled view shown.
holder.profile_image.setImageDrawable(null);
holder.setUserColor(getUserColor(mContext, conversationId));
holder.setTextSize(getTextSize());
@ -113,8 +110,10 @@ public class DirectMessageConversationEntriesAdapter extends BaseCursorAdapter i
if (displayProfileImage) {
holder.profile_image.setTag(position);
final String profile_image_url_string = cursor.getString(IDX_PROFILE_IMAGE_URL);
mLazyImageLoader.displayProfileImage(holder.profile_image, profile_image_url_string);
}
mImageLoader.displayProfileImage(holder.profile_image, profile_image_url_string);
} else {
mImageLoader.cancelDisplayTask(holder.profile_image);
}
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);

View File

@ -19,12 +19,6 @@
package org.mariotaku.twidere.adapter;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.findDirectMessageInDatabases;
import static org.mariotaku.twidere.util.Utils.formatToLongTimeString;
import static org.mariotaku.twidere.util.Utils.openImage;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
@ -45,208 +39,217 @@ import org.mariotaku.twidere.view.holder.DirectMessageConversationViewHolder;
import java.util.Locale;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.findDirectMessageInDatabases;
import static org.mariotaku.twidere.util.Utils.formatToLongTimeString;
import static org.mariotaku.twidere.util.Utils.openImage;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
public class DirectMessagesConversationAdapter extends BaseCursorAdapter implements IDirectMessagesAdapter,
OnClickListener {
private ScaleType mImagePreviewScaleType;
OnClickListener {
private ScaleType mImagePreviewScaleType;
private final ImageLoaderWrapper mImageLoader;
private final Context mContext;
private final MultiSelectManager mMultiSelectManager;
private MenuButtonClickListener mListener;
private final ImageLoadingHandler mImageLoadingHandler;
private final ImageLoaderWrapper mImageLoader;
private final Context mContext;
private final MultiSelectManager mMultiSelectManager;
private MenuButtonClickListener mListener;
private final ImageLoadingHandler mImageLoadingHandler;
private boolean mAnimationEnabled = true;
private boolean mAnimationEnabled = true;
private int mMaxAnimationPosition;
private ParcelableDirectMessage.CursorIndices mIndices;
private int mMaxAnimationPosition;
private ParcelableDirectMessage.CursorIndices mIndices;
public DirectMessagesConversationAdapter(final Context context) {
super(context, R.layout.card_item_message_conversation, null, new String[0], new int[0], 0);
mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context);
mMultiSelectManager = app.getMultiSelectManager();
mImageLoader = app.getImageLoaderWrapper();
mImageLoadingHandler = new ImageLoadingHandler(R.id.incoming_image_preview_progress,
R.id.outgoing_image_preview_progress);
configBaseCardAdapter(context, this);
}
public DirectMessagesConversationAdapter(final Context context) {
super(context, R.layout.card_item_message_conversation, null, new String[0], new int[0], 0);
mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context);
mMultiSelectManager = app.getMultiSelectManager();
mImageLoader = app.getImageLoaderWrapper();
mImageLoadingHandler = new ImageLoadingHandler(R.id.incoming_image_preview_progress,
R.id.outgoing_image_preview_progress);
configBaseCardAdapter(context, this);
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final int position = cursor.getPosition();
final DirectMessageConversationViewHolder holder = (DirectMessageConversationViewHolder) view.getTag();
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final int position = cursor.getPosition();
final DirectMessageConversationViewHolder holder = (DirectMessageConversationViewHolder) view.getTag();
final String firstMedia = cursor.getString(mIndices.first_media);
final String firstMedia = cursor.getString(mIndices.first_media);
final boolean displayProfileImage = isDisplayProfileImage();
final long accountId = cursor.getLong(mIndices.account_id);
final long timestamp = cursor.getLong(mIndices.message_timestamp);
final boolean is_outgoing = cursor.getInt(mIndices.is_outgoing) == 1;
final boolean displayProfileImage = isDisplayProfileImage();
final long accountId = cursor.getLong(mIndices.account_id);
final long timestamp = cursor.getLong(mIndices.message_timestamp);
final boolean is_outgoing = cursor.getInt(mIndices.is_outgoing) == 1;
// Clear images in prder to prevent images in recycled view shown.
holder.incoming_profile_image.setImageDrawable(null);
holder.outgoing_profile_image.setImageDrawable(null);
holder.incoming_message_container.setVisibility(is_outgoing ? View.GONE : View.VISIBLE);
holder.outgoing_message_container.setVisibility(is_outgoing ? View.VISIBLE : View.GONE);
holder.setTextSize(getTextSize());
holder.incoming_text.setText(Html.fromHtml(cursor.getString(mIndices.text)));
holder.outgoing_text.setText(Html.fromHtml(cursor.getString(mIndices.text)));
getLinkify().applyAllLinks(holder.incoming_text, accountId, false);
getLinkify().applyAllLinks(holder.outgoing_text, accountId, false);
holder.incoming_text.setMovementMethod(null);
holder.outgoing_text.setMovementMethod(null);
holder.incoming_time.setText(formatToLongTimeString(mContext, timestamp));
holder.outgoing_time.setText(formatToLongTimeString(mContext, timestamp));
holder.incoming_profile_image_container.setVisibility(displayProfileImage ? View.VISIBLE : View.GONE);
holder.outgoing_profile_image_container.setVisibility(displayProfileImage ? View.VISIBLE : View.GONE);
if (displayProfileImage) {
final String profile_image_url_string = cursor.getString(mIndices.sender_profile_image_url);
mImageLoader.displayProfileImage(holder.incoming_profile_image, profile_image_url_string);
mImageLoader.displayProfileImage(holder.outgoing_profile_image, profile_image_url_string);
holder.incoming_profile_image.setTag(position);
holder.outgoing_profile_image.setTag(position);
} else {
mImageLoader.cancelDisplayTask(holder.incoming_profile_image);
mImageLoader.cancelDisplayTask(holder.outgoing_profile_image);
}
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);
}
mMaxAnimationPosition = position;
}
holder.incoming_item_menu.setTag(position);
holder.outgoing_item_menu.setTag(position);
holder.incoming_message_container.setVisibility(is_outgoing ? View.GONE : View.VISIBLE);
holder.outgoing_message_container.setVisibility(is_outgoing ? View.VISIBLE : View.GONE);
holder.setTextSize(getTextSize());
holder.incoming_text.setText(Html.fromHtml(cursor.getString(mIndices.text)));
holder.outgoing_text.setText(Html.fromHtml(cursor.getString(mIndices.text)));
getLinkify().applyAllLinks(holder.incoming_text, accountId, false);
getLinkify().applyAllLinks(holder.outgoing_text, accountId, false);
holder.incoming_text.setMovementMethod(null);
holder.outgoing_text.setMovementMethod(null);
holder.incoming_time.setText(formatToLongTimeString(mContext, timestamp));
holder.outgoing_time.setText(formatToLongTimeString(mContext, timestamp));
holder.incoming_profile_image_container.setVisibility(displayProfileImage ? View.VISIBLE : View.GONE);
holder.outgoing_profile_image_container.setVisibility(displayProfileImage ? View.VISIBLE : View.GONE);
if (displayProfileImage) {
final String profile_image_url_string = cursor.getString(mIndices.sender_profile_image_url);
mImageLoader.displayProfileImage(holder.incoming_profile_image, profile_image_url_string);
mImageLoader.displayProfileImage(holder.outgoing_profile_image, profile_image_url_string);
holder.incoming_profile_image.setTag(position);
holder.outgoing_profile_image.setTag(position);
}
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);
}
mMaxAnimationPosition = position;
}
holder.incoming_item_menu.setTag(position);
holder.outgoing_item_menu.setTag(position);
if (firstMedia == null) {
mImageLoader.cancelDisplayTask(holder.incoming_image_preview);
mImageLoader.cancelDisplayTask(holder.outgoing_image_preview);
holder.outgoing_image_preview_container.setVisibility(View.GONE);
holder.incoming_image_preview_container.setVisibility(View.GONE);
} else if (is_outgoing) {
mImageLoader.cancelDisplayTask(holder.incoming_image_preview);
holder.outgoing_image_preview_container.setVisibility(View.VISIBLE);
holder.incoming_image_preview_container.setVisibility(View.GONE);
if (mImagePreviewScaleType != null) {
holder.outgoing_image_preview.setScaleType(mImagePreviewScaleType);
}
if (!firstMedia.equals(mImageLoadingHandler.getLoadingUri(holder.outgoing_image_preview))) {
holder.outgoing_image_preview.setBackgroundResource(0);
mImageLoader.displayPreviewImageWithCredentials(holder.outgoing_image_preview, firstMedia, accountId,
mImageLoadingHandler);
}
holder.outgoing_image_preview.setTag(position);
} else {
mImageLoader.cancelDisplayTask(holder.outgoing_image_preview);
holder.outgoing_image_preview_container.setVisibility(View.GONE);
holder.incoming_image_preview_container.setVisibility(View.VISIBLE);
if (mImagePreviewScaleType != null) {
holder.incoming_image_preview.setScaleType(mImagePreviewScaleType);
}
if (!firstMedia.equals(mImageLoadingHandler.getLoadingUri(holder.incoming_image_preview))) {
holder.incoming_image_preview.setBackgroundResource(0);
mImageLoader.displayPreviewImageWithCredentials(holder.incoming_image_preview, firstMedia, accountId,
mImageLoadingHandler);
}
holder.incoming_image_preview.setTag(position);
}
super.bindView(view, context, cursor);
}
if (firstMedia == null) {
holder.outgoing_image_preview_container.setVisibility(View.GONE);
holder.incoming_image_preview_container.setVisibility(View.GONE);
} else if (is_outgoing) {
holder.outgoing_image_preview_container.setVisibility(View.VISIBLE);
holder.incoming_image_preview_container.setVisibility(View.GONE);
if (mImagePreviewScaleType != null) {
holder.outgoing_image_preview.setScaleType(mImagePreviewScaleType);
}
if (!firstMedia.equals(mImageLoadingHandler.getLoadingUri(holder.outgoing_image_preview))) {
holder.outgoing_image_preview.setBackgroundResource(0);
mImageLoader.displayPreviewImageWithCredentials(holder.outgoing_image_preview, firstMedia, accountId,
mImageLoadingHandler);
}
holder.outgoing_image_preview.setTag(position);
} else {
holder.outgoing_image_preview_container.setVisibility(View.GONE);
holder.incoming_image_preview_container.setVisibility(View.VISIBLE);
if (mImagePreviewScaleType != null) {
holder.incoming_image_preview.setScaleType(mImagePreviewScaleType);
}
if (!firstMedia.equals(mImageLoadingHandler.getLoadingUri(holder.incoming_image_preview))) {
holder.incoming_image_preview.setBackgroundResource(0);
mImageLoader.displayPreviewImageWithCredentials(holder.incoming_image_preview, firstMedia, accountId,
mImageLoadingHandler);
}
holder.incoming_image_preview.setTag(position);
}
super.bindView(view, context, cursor);
}
@Override
public ParcelableDirectMessage findItem(final long id) {
for (int i = 0, count = getCount(); i < count; i++) {
if (getItemId(i) == id) return getDirectMessage(i);
}
return null;
}
@Override
public ParcelableDirectMessage findItem(final long id) {
for (int i = 0, count = getCount(); i < count; i++) {
if (getItemId(i) == id) return getDirectMessage(i);
}
return null;
}
public ParcelableDirectMessage getDirectMessage(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed()) return null;
c.moveToPosition(position);
final long account_id = c.getLong(mIndices.account_id);
final long message_id = c.getLong(mIndices.message_id);
return findDirectMessageInDatabases(mContext, account_id, message_id);
}
public ParcelableDirectMessage getDirectMessage(final int position) {
final Cursor c = getCursor();
if (c == null || c.isClosed()) return null;
c.moveToPosition(position);
final long account_id = c.getLong(mIndices.account_id);
final long message_id = c.getLong(mIndices.message_id);
return findDirectMessageInDatabases(mContext, account_id, message_id);
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final View view = super.newView(context, cursor, parent);
final Object tag = view.getTag();
if (!(tag instanceof DirectMessageConversationViewHolder)) {
final DirectMessageConversationViewHolder holder = new DirectMessageConversationViewHolder(view);
holder.incoming_profile_image.setOnClickListener(this);
holder.outgoing_profile_image.setOnClickListener(this);
holder.incoming_item_menu.setOnClickListener(this);
holder.outgoing_item_menu.setOnClickListener(this);
holder.incoming_image_preview.setOnClickListener(this);
holder.outgoing_image_preview.setOnClickListener(this);
view.setTag(holder);
}
return view;
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final View view = super.newView(context, cursor, parent);
final Object tag = view.getTag();
if (!(tag instanceof DirectMessageConversationViewHolder)) {
final DirectMessageConversationViewHolder holder = new DirectMessageConversationViewHolder(view);
holder.incoming_profile_image.setOnClickListener(this);
holder.outgoing_profile_image.setOnClickListener(this);
holder.incoming_item_menu.setOnClickListener(this);
holder.outgoing_item_menu.setOnClickListener(this);
holder.incoming_image_preview.setOnClickListener(this);
holder.outgoing_image_preview.setOnClickListener(this);
view.setTag(holder);
}
return view;
}
@Override
public void onClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
final int position = tag instanceof Integer ? (Integer) tag : -1;
if (position == -1) return;
switch (view.getId()) {
case R.id.incoming_profile_image:
case R.id.outgoing_profile_image: {
final ParcelableDirectMessage message = getDirectMessage(position);
if (message == null) return;
if (mContext instanceof Activity) {
openUserProfile((Activity) mContext, message.account_id, message.sender_id,
message.sender_screen_name);
}
break;
}
case R.id.incoming_item_menu:
case R.id.outgoing_item_menu: {
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
break;
}
case R.id.incoming_image_preview:
case R.id.outgoing_image_preview: {
if (position == -1) return;
final ParcelableDirectMessage message = getDirectMessage(position);
if (message == null || message.first_media == null) return;
openImage(mContext, message.account_id, message.first_media, false);
}
}
}
@Override
public void onClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
final int position = tag instanceof Integer ? (Integer) tag : -1;
if (position == -1) return;
switch (view.getId()) {
case R.id.incoming_profile_image:
case R.id.outgoing_profile_image: {
final ParcelableDirectMessage message = getDirectMessage(position);
if (message == null) return;
if (mContext instanceof Activity) {
openUserProfile((Activity) mContext, message.account_id, message.sender_id,
message.sender_screen_name);
}
break;
}
case R.id.incoming_item_menu:
case R.id.outgoing_item_menu: {
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
break;
}
case R.id.incoming_image_preview:
case R.id.outgoing_image_preview: {
if (position == -1) return;
final ParcelableDirectMessage message = getDirectMessage(position);
if (message == null || message.first_media == null) return;
openImage(mContext, message.account_id, message.first_media, false);
}
}
}
@Override
public void setAnimationEnabled(final boolean anim) {
mAnimationEnabled = anim;
}
@Override
public void setAnimationEnabled(final boolean anim) {
mAnimationEnabled = anim;
}
@Override
public void setDisplayImagePreview(final boolean display) {
// Images in DM are always enabled
}
@Override
public void setDisplayImagePreview(final boolean display) {
// Images in DM are always enabled
}
@Override
public void setImagePreviewScaleType(final String scaleTypeString) {
final ScaleType scaleType = ScaleType.valueOf(scaleTypeString.toUpperCase(Locale.US));
mImagePreviewScaleType = scaleType;
}
@Override
public void setImagePreviewScaleType(final String scaleTypeString) {
final ScaleType scaleType = ScaleType.valueOf(scaleTypeString.toUpperCase(Locale.US));
mImagePreviewScaleType = scaleType;
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
@Override
public Cursor swapCursor(final Cursor cursor) {
if (cursor != null) {
mIndices = new ParcelableDirectMessage.CursorIndices(cursor);
} else {
mIndices = null;
}
return super.swapCursor(cursor);
}
@Override
public Cursor swapCursor(final Cursor cursor) {
if (cursor != null) {
mIndices = new ParcelableDirectMessage.CursorIndices(cursor);
} else {
mIndices = null;
}
return super.swapCursor(cursor);
}
}

View File

@ -68,8 +68,11 @@ public class DraftsAdapter extends SimpleCursorAdapter {
holder.image_preview_container.setVisibility(TextUtils.isEmpty(mediaUri) ? View.GONE : View.VISIBLE);
if (mediaUri != null && !mediaUri.equals(mImageLoadingHandler.getLoadingUri(holder.image_preview))) {
mImageLoader.displayPreviewImage(holder.image_preview, mediaUri, mImageLoadingHandler);
}
}else {
mImageLoader.cancelDisplayTask(holder.image_preview);
}
} else {
mImageLoader.cancelDisplayTask(holder.image_preview);
holder.image_preview_container.setVisibility(View.GONE);
}
holder.content.drawEnd(getAccountColors(context, accountIds));

View File

@ -62,6 +62,7 @@ public class MediaPreviewAdapter extends ArrayAdapter<String> implements Constan
if (mIsPossiblySensitive && !mPreferences.getBoolean(KEY_DISPLAY_SENSITIVE_CONTENTS, false)) {
view.findViewById(R.id.image_preview_progress).setVisibility(View.GONE);
image_view.setBackgroundResource(R.drawable.image_preview_nsfw);
mImageLoader.cancelDisplayTask(image_view);
} else if (!link.equals(mImageLoadingHandler.getLoadingUri(image_view))) {
image_view.setBackgroundResource(0);
mImageLoader.displayPreviewImage(image_view, link, mImageLoadingHandler);

View File

@ -184,17 +184,12 @@ public class ParcelableStatusesAdapter extends BaseArrayAdapter<ParcelableStatus
holder.setDisplayProfileImage(isDisplayProfileImage());
holder.setCardHighlightOption(mCardHighlightOption);
final ImageLoaderWrapper loader = getImageLoader();
if (!showGap) {
final TwidereLinkify linkify = getLinkify();
final ImageLoaderWrapper loader = getImageLoader();
final int highlightOption = getLinkHighlightOption();
final boolean mShowAccountColor = isShowAccountColor();
// Clear images in prder to prevent images in recycled view shown.
holder.profile_image.setImageDrawable(null);
holder.my_profile_image.setImageDrawable(null);
holder.image_preview.setImageDrawable(null);
holder.setAccountColorEnabled(mShowAccountColor);
if (highlightOption != VALUE_LINK_HIGHLIGHT_OPTION_CODE_NONE) {
@ -259,6 +254,8 @@ public class ParcelableStatusesAdapter extends BaseArrayAdapter<ParcelableStatus
holder.profile_image.setTag(position);
holder.my_profile_image.setTag(position);
} else {
loader.cancelDisplayTask(holder.profile_image);
loader.cancelDisplayTask(holder.my_profile_image);
holder.profile_image.setVisibility(View.GONE);
holder.my_profile_image.setVisibility(View.GONE);
}
@ -280,7 +277,13 @@ public class ParcelableStatusesAdapter extends BaseArrayAdapter<ParcelableStatus
final int count = status.medias.length;
holder.image_preview_count.setText(res.getQuantityString(R.plurals.N_medias, count, count));
holder.image_preview.setTag(position);
} else {
loader.cancelDisplayTask(holder.image_preview);
}
} else {
loader.cancelDisplayTask(holder.profile_image);
loader.cancelDisplayTask(holder.my_profile_image);
loader.cancelDisplayTask(holder.image_preview);
}
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {

View File

@ -19,11 +19,6 @@
package org.mariotaku.twidere.adapter;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.getDisplayName;
import static org.mariotaku.twidere.util.Utils.getLocalizedNumber;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
import android.app.Activity;
import android.content.Context;
import android.text.TextUtils;
@ -44,148 +39,153 @@ import org.mariotaku.twidere.view.iface.ICardItemView.OnOverflowIconClickListene
import java.util.List;
import java.util.Locale;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.getDisplayName;
import static org.mariotaku.twidere.util.Utils.getLocalizedNumber;
import static org.mariotaku.twidere.util.Utils.openUserProfile;
public class ParcelableUserListsAdapter extends BaseArrayAdapter<ParcelableUserList> implements IBaseCardAdapter,
OnClickListener, OnOverflowIconClickListener {
OnClickListener, OnOverflowIconClickListener {
private final Context mContext;
private final ImageLoaderWrapper mProfileImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final Locale mLocale;
private final Context mContext;
private final ImageLoaderWrapper mImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final Locale mLocale;
private MenuButtonClickListener mListener;
private MenuButtonClickListener mListener;
private boolean mAnimationEnabled;
private int mMaxAnimationPosition;
private final boolean mPlainList;
private boolean mAnimationEnabled;
private int mMaxAnimationPosition;
private final boolean mPlainList;
public ParcelableUserListsAdapter(final Context context) {
this(context, Utils.isCompactCards(context), Utils.isPlainListStyle(context));
}
public ParcelableUserListsAdapter(final Context context) {
this(context, Utils.isCompactCards(context), Utils.isPlainListStyle(context));
}
public ParcelableUserListsAdapter(final Context context, final boolean compactCards, final boolean plainList) {
super(context, getItemResource(compactCards));
mPlainList = plainList;
mContext = context;
mLocale = context.getResources().getConfiguration().locale;
final TwidereApplication app = TwidereApplication.getInstance(context);
mProfileImageLoader = app.getImageLoaderWrapper();
mMultiSelectManager = app.getMultiSelectManager();
configBaseCardAdapter(context, this);
}
public ParcelableUserListsAdapter(final Context context, final boolean compactCards, final boolean plainList) {
super(context, getItemResource(compactCards));
mPlainList = plainList;
mContext = context;
mLocale = context.getResources().getConfiguration().locale;
final TwidereApplication app = TwidereApplication.getInstance(context);
mImageLoader = app.getImageLoaderWrapper();
mMultiSelectManager = app.getMultiSelectManager();
configBaseCardAdapter(context, this);
}
public void appendData(final List<ParcelableUserList> data) {
setData(data, false);
}
public void appendData(final List<ParcelableUserList> data) {
setData(data, false);
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final UserListViewHolder holder;
if (tag instanceof UserListViewHolder) {
holder = (UserListViewHolder) tag;
} else {
holder = new UserListViewHolder(view);
holder.profile_image.setOnClickListener(this);
holder.content.setOnOverflowIconClickListener(this);
if (mPlainList) {
((View) holder.content).setPadding(0, 0, 0, 0);
holder.content.setItemBackground(null);
}
view.setTag(holder);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final UserListViewHolder holder;
if (tag instanceof UserListViewHolder) {
holder = (UserListViewHolder) tag;
} else {
holder = new UserListViewHolder(view);
holder.profile_image.setOnClickListener(this);
holder.content.setOnOverflowIconClickListener(this);
if (mPlainList) {
((View) holder.content).setPadding(0, 0, 0, 0);
holder.content.setItemBackground(null);
}
view.setTag(holder);
}
holder.position = position;
// Clear images in prder to prevent images in recycled view shown.
holder.profile_image.setImageDrawable(null);
holder.position = position;
final ParcelableUserList user_list = getItem(position);
final String display_name = getDisplayName(mContext, user_list.user_id, user_list.user_name,
user_list.user_screen_name, isDisplayNameFirst(), isNicknameOnly(), false);
holder.setTextSize(getTextSize());
holder.name.setText(user_list.name);
holder.created_by.setText(mContext.getString(R.string.created_by, display_name));
holder.description.setVisibility(TextUtils.isEmpty(user_list.description) ? View.GONE : View.VISIBLE);
holder.description.setText(user_list.description);
holder.members_count.setText(getLocalizedNumber(mLocale, user_list.members_count));
holder.subscribers_count.setText(getLocalizedNumber(mLocale, user_list.subscribers_count));
holder.profile_image.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mProfileImageLoader.displayProfileImage(holder.profile_image, user_list.user_profile_image_url);
}
holder.profile_image.setTag(position);
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);
}
mMaxAnimationPosition = position;
}
return view;
}
final ParcelableUserList user_list = getItem(position);
final String display_name = getDisplayName(mContext, user_list.user_id, user_list.user_name,
user_list.user_screen_name, isDisplayNameFirst(), isNicknameOnly(), false);
holder.setTextSize(getTextSize());
holder.name.setText(user_list.name);
holder.created_by.setText(mContext.getString(R.string.created_by, display_name));
holder.description.setVisibility(TextUtils.isEmpty(user_list.description) ? View.GONE : View.VISIBLE);
holder.description.setText(user_list.description);
holder.members_count.setText(getLocalizedNumber(mLocale, user_list.members_count));
holder.subscribers_count.setText(getLocalizedNumber(mLocale, user_list.subscribers_count));
holder.profile_image.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mImageLoader.displayProfileImage(holder.profile_image, user_list.user_profile_image_url);
} else {
mImageLoader.cancelDisplayTask(holder.profile_image);
}
holder.profile_image.setTag(position);
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);
}
mMaxAnimationPosition = position;
}
return view;
}
@Override
public void onClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
final int position = tag instanceof Integer ? (Integer) tag : -1;
if (position == -1) return;
switch (view.getId()) {
case R.id.profile_image: {
if (mContext instanceof Activity) {
final ParcelableUserList item = getItem(position);
openUserProfile((Activity) mContext, item.account_id, item.user_id, item.user_screen_name);
}
break;
}
}
}
@Override
public void onClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
final int position = tag instanceof Integer ? (Integer) tag : -1;
if (position == -1) return;
switch (view.getId()) {
case R.id.profile_image: {
if (mContext instanceof Activity) {
final ParcelableUserList item = getItem(position);
openUserProfile((Activity) mContext, item.account_id, item.user_id, item.user_screen_name);
}
break;
}
}
}
@Override
public void onOverflowIconClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
if (tag instanceof UserListViewHolder) {
final UserListViewHolder holder = (UserListViewHolder) tag;
final int position = holder.position;
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
}
}
@Override
public void onOverflowIconClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
if (tag instanceof UserListViewHolder) {
final UserListViewHolder holder = (UserListViewHolder) tag;
final int position = holder.position;
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
}
}
@Override
public void setAnimationEnabled(final boolean anim) {
if (mAnimationEnabled == anim) return;
mAnimationEnabled = anim;
}
@Override
public void setAnimationEnabled(final boolean anim) {
if (mAnimationEnabled == anim) return;
mAnimationEnabled = anim;
}
public void setData(final List<ParcelableUserList> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUserList user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
public void setData(final List<ParcelableUserList> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUserList user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
private static int getItemResource(final boolean compactCards) {
return compactCards ? R.layout.card_item_user_list_compact : R.layout.card_item_user_list;
}
private static int getItemResource(final boolean compactCards) {
return compactCards ? R.layout.card_item_user_list_compact : R.layout.card_item_user_list;
}
}

View File

@ -19,13 +19,6 @@
package org.mariotaku.twidere.adapter;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserColor;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserNickname;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getLocalizedNumber;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
@ -44,148 +37,153 @@ import org.mariotaku.twidere.view.iface.ICardItemView.OnOverflowIconClickListene
import java.util.List;
import java.util.Locale;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserColor;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserNickname;
import static org.mariotaku.twidere.util.Utils.configBaseCardAdapter;
import static org.mariotaku.twidere.util.Utils.getAccountColor;
import static org.mariotaku.twidere.util.Utils.getLocalizedNumber;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
public class ParcelableUsersAdapter extends BaseArrayAdapter<ParcelableUser> implements IBaseCardAdapter,
OnOverflowIconClickListener {
OnOverflowIconClickListener {
private final ImageLoaderWrapper mProfileImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final Context mContext;
private MenuButtonClickListener mListener;
private final ImageLoaderWrapper mProfileImageLoader;
private final MultiSelectManager mMultiSelectManager;
private final Context mContext;
private MenuButtonClickListener mListener;
private final Locale mLocale;
private final boolean mPlainList;
private final Locale mLocale;
private final boolean mPlainList;
private boolean mAnimationEnabled;
private int mMaxAnimationPosition;
private boolean mAnimationEnabled;
private int mMaxAnimationPosition;
public ParcelableUsersAdapter(final Context context) {
this(context, Utils.isCompactCards(context), Utils.isPlainListStyle(context));
}
public ParcelableUsersAdapter(final Context context) {
this(context, Utils.isCompactCards(context), Utils.isPlainListStyle(context));
}
public ParcelableUsersAdapter(final Context context, final boolean compactCards, final boolean plainList) {
super(context, getItemResource(compactCards));
mPlainList = plainList;
mContext = context;
mLocale = context.getResources().getConfiguration().locale;
final TwidereApplication app = TwidereApplication.getInstance(context);
mProfileImageLoader = app.getImageLoaderWrapper();
mMultiSelectManager = app.getMultiSelectManager();
configBaseCardAdapter(context, this);
}
public ParcelableUsersAdapter(final Context context, final boolean compactCards, final boolean plainList) {
super(context, getItemResource(compactCards));
mPlainList = plainList;
mContext = context;
mLocale = context.getResources().getConfiguration().locale;
final TwidereApplication app = TwidereApplication.getInstance(context);
mProfileImageLoader = app.getImageLoaderWrapper();
mMultiSelectManager = app.getMultiSelectManager();
configBaseCardAdapter(context, this);
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
UserViewHolder holder = null;
if (tag instanceof UserViewHolder) {
holder = (UserViewHolder) tag;
} else {
holder = new UserViewHolder(view);
holder.content.setOnOverflowIconClickListener(this);
if (mPlainList) {
((View) holder.content).setPadding(0, 0, 0, 0);
holder.content.setItemBackground(null);
}
view.setTag(holder);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final UserViewHolder holder;
if (tag instanceof UserViewHolder) {
holder = (UserViewHolder) tag;
} else {
holder = new UserViewHolder(view);
holder.content.setOnOverflowIconClickListener(this);
if (mPlainList) {
((View) holder.content).setPadding(0, 0, 0, 0);
holder.content.setItemBackground(null);
}
view.setTag(holder);
}
// Clear images in prder to prevent images in recycled view shown.
holder.profile_image.setImageDrawable(null);
holder.position = position;
holder.position = position;
final ParcelableUser user = getItem(position);
final ParcelableUser user = getItem(position);
final boolean showAccountColor = isShowAccountColor();
final boolean showAccountColor = isShowAccountColor();
holder.setAccountColorEnabled(showAccountColor);
holder.setAccountColorEnabled(showAccountColor);
if (showAccountColor) {
holder.setAccountColor(getAccountColor(mContext, user.account_id));
}
if (showAccountColor) {
holder.setAccountColor(getAccountColor(mContext, user.account_id));
}
holder.setUserColor(getUserColor(mContext, user.id));
holder.setUserColor(getUserColor(mContext, user.id));
holder.setTextSize(getTextSize());
holder.name.setCompoundDrawablesWithIntrinsicBounds(0, 0,
getUserTypeIconRes(user.is_verified, user.is_protected), 0);
final String nick = getUserNickname(mContext, user.id);
holder.name.setText(TextUtils.isEmpty(nick) ? user.name : isNicknameOnly() ? nick : mContext.getString(
R.string.name_with_nickname, user.name, nick));
holder.screen_name.setText("@" + user.screen_name);
holder.description.setVisibility(TextUtils.isEmpty(user.description_unescaped) ? View.GONE : View.VISIBLE);
holder.description.setText(user.description_unescaped);
holder.location.setVisibility(TextUtils.isEmpty(user.location) ? View.GONE : View.VISIBLE);
holder.location.setText(user.location);
holder.url.setVisibility(TextUtils.isEmpty(user.url_expanded) ? View.GONE : View.VISIBLE);
holder.url.setText(user.url_expanded);
holder.statuses_count.setText(getLocalizedNumber(mLocale, user.statuses_count));
holder.followers_count.setText(getLocalizedNumber(mLocale, user.followers_count));
holder.friends_count.setText(getLocalizedNumber(mLocale, user.friends_count));
holder.profile_image.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mProfileImageLoader.displayProfileImage(holder.profile_image, user.profile_image_url);
}
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);
}
mMaxAnimationPosition = position;
}
return view;
}
holder.setTextSize(getTextSize());
holder.name.setCompoundDrawablesWithIntrinsicBounds(0, 0,
getUserTypeIconRes(user.is_verified, user.is_protected), 0);
final String nick = getUserNickname(mContext, user.id);
holder.name.setText(TextUtils.isEmpty(nick) ? user.name : isNicknameOnly() ? nick : mContext.getString(
R.string.name_with_nickname, user.name, nick));
holder.screen_name.setText("@" + user.screen_name);
holder.description.setVisibility(TextUtils.isEmpty(user.description_unescaped) ? View.GONE : View.VISIBLE);
holder.description.setText(user.description_unescaped);
holder.location.setVisibility(TextUtils.isEmpty(user.location) ? View.GONE : View.VISIBLE);
holder.location.setText(user.location);
holder.url.setVisibility(TextUtils.isEmpty(user.url_expanded) ? View.GONE : View.VISIBLE);
holder.url.setText(user.url_expanded);
holder.statuses_count.setText(getLocalizedNumber(mLocale, user.statuses_count));
holder.followers_count.setText(getLocalizedNumber(mLocale, user.followers_count));
holder.friends_count.setText(getLocalizedNumber(mLocale, user.friends_count));
holder.profile_image.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mProfileImageLoader.displayProfileImage(holder.profile_image, user.profile_image_url);
}
if (position > mMaxAnimationPosition) {
if (mAnimationEnabled) {
view.startAnimation(holder.item_animation);
}
mMaxAnimationPosition = position;
}
return view;
}
@Override
public void onOverflowIconClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
if (tag instanceof UserViewHolder) {
final UserViewHolder holder = (UserViewHolder) tag;
final int position = holder.position;
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
}
}
@Override
public void onOverflowIconClick(final View view) {
if (mMultiSelectManager.isActive()) return;
final Object tag = view.getTag();
if (tag instanceof UserViewHolder) {
final UserViewHolder holder = (UserViewHolder) tag;
final int position = holder.position;
if (position == -1 || mListener == null) return;
mListener.onMenuButtonClick(view, position, getItemId(position));
}
}
@Override
public void setAnimationEnabled(final boolean anim) {
if (mAnimationEnabled == anim) return;
mAnimationEnabled = anim;
}
@Override
public void setAnimationEnabled(final boolean anim) {
if (mAnimationEnabled == anim) return;
mAnimationEnabled = anim;
}
public void setData(final List<ParcelableUser> data) {
setData(data, false);
}
public void setData(final List<ParcelableUser> data) {
setData(data, false);
}
public void setData(final List<ParcelableUser> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUser user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
public void setData(final List<ParcelableUser> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUser user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMaxAnimationPosition(final int position) {
mMaxAnimationPosition = position;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
@Override
public void setMenuButtonClickListener(final MenuButtonClickListener listener) {
mListener = listener;
}
private static int getItemResource(final boolean compactCards) {
return compactCards ? R.layout.card_item_user_compact : R.layout.card_item_user;
}
private static int getItemResource(final boolean compactCards) {
return compactCards ? R.layout.card_item_user_compact : R.layout.card_item_user;
}
}

View File

@ -19,9 +19,6 @@
package org.mariotaku.twidere.adapter;
import static org.mariotaku.twidere.util.Utils.configBaseAdapter;
import static org.mariotaku.twidere.util.Utils.getDisplayName;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
@ -35,65 +32,70 @@ import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder;
import java.util.List;
import static org.mariotaku.twidere.util.Utils.configBaseAdapter;
import static org.mariotaku.twidere.util.Utils.getDisplayName;
public class SimpleParcelableUserListsAdapter extends BaseArrayAdapter<ParcelableUserList> implements IBaseAdapter {
private final Context mContext;
private final ImageLoaderWrapper mProfileImageLoader;
private final Context mContext;
private final ImageLoaderWrapper mImageLoader;
public SimpleParcelableUserListsAdapter(final Context context) {
super(context, R.layout.list_item_two_line);
mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context);
mProfileImageLoader = app.getImageLoaderWrapper();
configBaseAdapter(context, this);
}
public SimpleParcelableUserListsAdapter(final Context context) {
super(context, R.layout.list_item_two_line);
mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context);
mImageLoader = app.getImageLoaderWrapper();
configBaseAdapter(context, this);
}
public void appendData(final List<ParcelableUserList> data) {
setData(data, false);
}
public void appendData(final List<ParcelableUserList> data) {
setData(data, false);
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final TwoLineWithIconViewHolder holder;
if (tag instanceof TwoLineWithIconViewHolder) {
holder = (TwoLineWithIconViewHolder) tag;
} else {
holder = new TwoLineWithIconViewHolder(view);
view.setTag(holder);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final TwoLineWithIconViewHolder holder;
if (tag instanceof TwoLineWithIconViewHolder) {
holder = (TwoLineWithIconViewHolder) tag;
} else {
holder = new TwoLineWithIconViewHolder(view);
view.setTag(holder);
}
// Clear images in prder to prevent images in recycled view shown.
holder.icon.setImageDrawable(null);
// Clear images in prder to prevent images in recycled view shown.
holder.icon.setImageDrawable(null);
final ParcelableUserList user_list = getItem(position);
final String display_name = getDisplayName(mContext, user_list.user_id, user_list.user_name,
user_list.user_screen_name, isDisplayNameFirst(), isNicknameOnly(), false);
holder.text1.setText(user_list.name);
holder.text2.setText(mContext.getString(R.string.created_by, display_name));
holder.icon.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mProfileImageLoader.displayProfileImage(holder.icon, user_list.user_profile_image_url);
}
return view;
}
final ParcelableUserList user_list = getItem(position);
final String display_name = getDisplayName(mContext, user_list.user_id, user_list.user_name,
user_list.user_screen_name, isDisplayNameFirst(), isNicknameOnly(), false);
holder.text1.setText(user_list.name);
holder.text2.setText(mContext.getString(R.string.created_by, display_name));
holder.icon.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mImageLoader.displayProfileImage(holder.icon, user_list.user_profile_image_url);
} else {
mImageLoader.cancelDisplayTask(holder.icon);
}
return view;
}
public void setData(final List<ParcelableUserList> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUserList user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
public void setData(final List<ParcelableUserList> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUserList user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
}

View File

@ -19,10 +19,6 @@
package org.mariotaku.twidere.adapter;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserNickname;
import static org.mariotaku.twidere.util.Utils.configBaseAdapter;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
@ -37,68 +33,71 @@ import org.mariotaku.twidere.view.holder.TwoLineWithIconViewHolder;
import java.util.List;
import static org.mariotaku.twidere.util.UserColorNicknameUtils.getUserNickname;
import static org.mariotaku.twidere.util.Utils.configBaseAdapter;
import static org.mariotaku.twidere.util.Utils.getUserTypeIconRes;
public class SimpleParcelableUsersAdapter extends BaseArrayAdapter<ParcelableUser> implements IBaseAdapter {
private final ImageLoaderWrapper mProfileImageLoader;
private final Context mContext;
private final ImageLoaderWrapper mImageLoader;
private final Context mContext;
public SimpleParcelableUsersAdapter(final Context context) {
super(context, R.layout.list_item_two_line);
mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context);
mProfileImageLoader = app.getImageLoaderWrapper();
configBaseAdapter(context, this);
}
public SimpleParcelableUsersAdapter(final Context context) {
super(context, R.layout.list_item_two_line);
mContext = context;
final TwidereApplication app = TwidereApplication.getInstance(context);
mImageLoader = app.getImageLoaderWrapper();
configBaseAdapter(context, this);
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public long getItemId(final int position) {
return getItem(position) != null ? getItem(position).id : -1;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final TwoLineWithIconViewHolder holder;
if (tag instanceof TwoLineWithIconViewHolder) {
holder = (TwoLineWithIconViewHolder) tag;
} else {
holder = new TwoLineWithIconViewHolder(view);
view.setTag(holder);
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = super.getView(position, convertView, parent);
final Object tag = view.getTag();
final TwoLineWithIconViewHolder holder;
if (tag instanceof TwoLineWithIconViewHolder) {
holder = (TwoLineWithIconViewHolder) tag;
} else {
holder = new TwoLineWithIconViewHolder(view);
view.setTag(holder);
}
// Clear images in prder to prevent images in recycled view shown.
holder.icon.setImageDrawable(null);
final ParcelableUser user = getItem(position);
final ParcelableUser user = getItem(position);
holder.text1.setCompoundDrawablesWithIntrinsicBounds(0, 0,
getUserTypeIconRes(user.is_verified, user.is_protected), 0);
final String nick = getUserNickname(mContext, user.id);
holder.text1.setText(TextUtils.isEmpty(nick) ? user.name : isNicknameOnly() ? nick : mContext.getString(
R.string.name_with_nickname, user.name, nick));
holder.text2.setText("@" + user.screen_name);
holder.icon.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mImageLoader.displayProfileImage(holder.icon, user.profile_image_url);
} else {
mImageLoader.cancelDisplayTask(holder.icon);
}
return view;
}
holder.text1.setCompoundDrawablesWithIntrinsicBounds(0, 0,
getUserTypeIconRes(user.is_verified, user.is_protected), 0);
final String nick = getUserNickname(mContext, user.id);
holder.text1.setText(TextUtils.isEmpty(nick) ? user.name : isNicknameOnly() ? nick : mContext.getString(
R.string.name_with_nickname, user.name, nick));
holder.text2.setText("@" + user.screen_name);
holder.icon.setVisibility(isDisplayProfileImage() ? View.VISIBLE : View.GONE);
if (isDisplayProfileImage()) {
mProfileImageLoader.displayProfileImage(holder.icon, user.profile_image_url);
}
return view;
}
public void setData(final List<ParcelableUser> data) {
setData(data, false);
}
public void setData(final List<ParcelableUser> data) {
setData(data, false);
}
public void setData(final List<ParcelableUser> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUser user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
public void setData(final List<ParcelableUser> data, final boolean clear_old) {
if (clear_old) {
clear();
}
if (data == null) return;
for (final ParcelableUser user : data) {
if (clear_old || findItem(user.id) == null) {
add(user);
}
}
}
}

View File

@ -95,7 +95,7 @@ public class UserHashtagAutoCompleteAdapter extends SimpleCursorAdapter implemen
final int themeRes, accentColor;
if (context instanceof IThemedActivity) {
themeRes = ((IThemedActivity) context).getThemeResourceId();
accentColor = ((IThemedActivity) context).getThemeColor();
accentColor = ((IThemedActivity) context).getOverrideAccentColor();
} else {
themeRes = ThemeUtils.getThemeResource(context);
accentColor = ThemeUtils.getUserThemeColor(context);

View File

@ -19,14 +19,6 @@
package org.mariotaku.twidere.fragment;
import static org.mariotaku.twidere.util.CustomTabUtils.getConfiguraionMap;
import static org.mariotaku.twidere.util.CustomTabUtils.getTabIconDrawable;
import static org.mariotaku.twidere.util.CustomTabUtils.getTabIconObject;
import static org.mariotaku.twidere.util.CustomTabUtils.getTabTypeName;
import static org.mariotaku.twidere.util.CustomTabUtils.isTabAdded;
import static org.mariotaku.twidere.util.CustomTabUtils.isTabTypeValid;
import static org.mariotaku.twidere.util.Utils.getAccountIds;
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentResolver;
@ -44,7 +36,6 @@ import android.text.TextUtils;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
@ -80,311 +71,319 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import static org.mariotaku.twidere.util.CustomTabUtils.getConfiguraionMap;
import static org.mariotaku.twidere.util.CustomTabUtils.getTabIconDrawable;
import static org.mariotaku.twidere.util.CustomTabUtils.getTabIconObject;
import static org.mariotaku.twidere.util.CustomTabUtils.getTabTypeName;
import static org.mariotaku.twidere.util.CustomTabUtils.isTabAdded;
import static org.mariotaku.twidere.util.CustomTabUtils.isTabTypeValid;
import static org.mariotaku.twidere.util.Utils.getAccountIds;
public class CustomTabsFragment extends BaseListFragment implements LoaderCallbacks<Cursor>, Panes.Right,
MultiChoiceModeListener, DropListener {
MultiChoiceModeListener, DropListener {
private ContentResolver mResolver;
private ContentResolver mResolver;
private DragSortListView mListView;
private DragSortListView mListView;
private PopupMenu mPopupMenu;
private PopupMenu mPopupMenu;
private CustomTabsAdapter mAdapter;
private CustomTabsAdapter mAdapter;
@Override
public void drop(final int from, final int to) {
mAdapter.drop(from, to);
mListView.moveCheckState(from, to);
saveTabPositions();
}
@Override
public void drop(final int from, final int to) {
mAdapter.drop(from, to);
mListView.moveCheckState(from, to);
saveTabPositions();
}
@Override
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
switch (item.getItemId()) {
case MENU_DELETE: {
final Where where = Where.in(new Column(Tabs._ID), new RawItemArray(mListView.getCheckedItemIds()));
mResolver.delete(Tabs.CONTENT_URI, where.getSQL(), null);
break;
}
}
mode.finish();
return true;
}
@Override
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
switch (item.getItemId()) {
case MENU_DELETE: {
final Where where = Where.in(new Column(Tabs._ID), new RawItemArray(mListView.getCheckedItemIds()));
mResolver.delete(Tabs.CONTENT_URI, where.getSQL(), null);
break;
}
}
mode.finish();
return true;
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
mResolver = getContentResolver();
final Activity activity = getActivity();
final int themeRes;
if (activity instanceof IThemedActivity) {
themeRes = ((IThemedActivity) activity).getThemeResourceId();
} else {
themeRes = ThemeUtils.getSettingsThemeResource(activity);
}
mAdapter = new CustomTabsAdapter(ThemeUtils.getThemedContextForActionIcons(activity, themeRes));
setListAdapter(mAdapter);
setEmptyText(getString(R.string.no_tab_hint));
mListView = (DragSortListView) getListView();
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(this);
mListView.setDropListener(this);
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setHasOptionsMenu(true);
mResolver = getContentResolver();
final Activity activity = getActivity();
final int themeRes;
if (activity instanceof IThemedActivity) {
themeRes = ((IThemedActivity) activity).getThemeResourceId();
} else {
themeRes = ThemeUtils.getSettingsThemeResource(activity);
}
mAdapter = new CustomTabsAdapter(ThemeUtils.getThemedContextForActionIcons(activity, themeRes));
setListAdapter(mAdapter);
setEmptyText(getString(R.string.no_tab_hint));
mListView = (DragSortListView) getListView();
mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(this);
mListView.setDropListener(this);
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_ADD_TAB: {
if (resultCode == Activity.RESULT_OK) {
final ContentValues values = new ContentValues();
values.put(Tabs.NAME, data.getStringExtra(EXTRA_NAME));
values.put(Tabs.ICON, data.getStringExtra(EXTRA_ICON));
values.put(Tabs.TYPE, data.getStringExtra(EXTRA_TYPE));
values.put(Tabs.ARGUMENTS, data.getStringExtra(EXTRA_ARGUMENTS));
values.put(Tabs.EXTRAS, data.getStringExtra(EXTRA_EXTRAS));
values.put(Tabs.POSITION, mAdapter.getCount());
mResolver.insert(Tabs.CONTENT_URI, values);
}
break;
}
case REQUEST_EDIT_TAB: {
if (resultCode == Activity.RESULT_OK && data.hasExtra(EXTRA_ID)) {
final ContentValues values = new ContentValues();
values.put(Tabs.NAME, data.getStringExtra(EXTRA_NAME));
values.put(Tabs.ICON, data.getStringExtra(EXTRA_ICON));
values.put(Tabs.EXTRAS, data.getStringExtra(EXTRA_EXTRAS));
final String where = Where.equals(Tabs._ID, data.getLongExtra(EXTRA_ID, -1)).getSQL();
mResolver.update(Tabs.CONTENT_URI, values, where, null);
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
switch (requestCode) {
case REQUEST_ADD_TAB: {
if (resultCode == Activity.RESULT_OK) {
final ContentValues values = new ContentValues();
values.put(Tabs.NAME, data.getStringExtra(EXTRA_NAME));
values.put(Tabs.ICON, data.getStringExtra(EXTRA_ICON));
values.put(Tabs.TYPE, data.getStringExtra(EXTRA_TYPE));
values.put(Tabs.ARGUMENTS, data.getStringExtra(EXTRA_ARGUMENTS));
values.put(Tabs.EXTRAS, data.getStringExtra(EXTRA_EXTRAS));
values.put(Tabs.POSITION, mAdapter.getCount());
mResolver.insert(Tabs.CONTENT_URI, values);
}
break;
}
case REQUEST_EDIT_TAB: {
if (resultCode == Activity.RESULT_OK && data.hasExtra(EXTRA_ID)) {
final ContentValues values = new ContentValues();
values.put(Tabs.NAME, data.getStringExtra(EXTRA_NAME));
values.put(Tabs.ICON, data.getStringExtra(EXTRA_ICON));
values.put(Tabs.EXTRAS, data.getStringExtra(EXTRA_EXTRAS));
final String where = Where.equals(Tabs._ID, data.getLongExtra(EXTRA_ID, -1)).getSQL();
mResolver.update(Tabs.CONTENT_URI, values, where, null);
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
new MenuInflater(getActivity()).inflate(R.menu.action_multi_select_items, menu);
return true;
}
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
new TwidereMenuInflater(getActivity()).inflate(R.menu.action_multi_select_items, menu);
return true;
}
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
return new CursorLoader(getActivity(), Tabs.CONTENT_URI, Tabs.COLUMNS, null, null, Tabs.DEFAULT_SORT_ORDER);
}
@Override
public Loader<Cursor> onCreateLoader(final int id, final Bundle args) {
return new CursorLoader(getActivity(), Tabs.CONTENT_URI, Tabs.COLUMNS, null, null, Tabs.DEFAULT_SORT_ORDER);
}
@Override
public void onCreateOptionsMenu(final Menu menu, final TwidereMenuInflater inflater) {
inflater.inflate(R.menu.menu_custom_tabs, menu);
}
@Override
public void onCreateOptionsMenu(final Menu menu, final TwidereMenuInflater inflater) {
inflater.inflate(R.menu.menu_custom_tabs, menu);
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
final View view = inflater.inflate(android.R.layout.list_content, null, false);
final ListView originalList = (ListView) view.findViewById(android.R.id.list);
final ViewGroup listContainer = (ViewGroup) originalList.getParent();
listContainer.removeView(originalList);
inflater.inflate(R.layout.fragment_custom_tabs, listContainer, true);
return view;
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
final View view = inflater.inflate(android.R.layout.list_content, null, false);
final ListView originalList = (ListView) view.findViewById(android.R.id.list);
final ViewGroup listContainer = (ViewGroup) originalList.getParent();
listContainer.removeView(originalList);
inflater.inflate(R.layout.fragment_custom_tabs, listContainer, true);
return view;
}
@Override
public void onDestroyActionMode(final ActionMode mode) {
@Override
public void onDestroyActionMode(final ActionMode mode) {
}
}
@Override
public void onItemCheckedStateChanged(final ActionMode mode, final int position, final long id,
final boolean checked) {
updateTitle(mode);
}
@Override
public void onItemCheckedStateChanged(final ActionMode mode, final int position, final long id,
final boolean checked) {
updateTitle(mode);
}
@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
final Cursor c = mAdapter.getCursor();
c.moveToPosition(mAdapter.getCursorPosition(position));
final Intent intent = new Intent(INTENT_ACTION_EDIT_TAB);
intent.setClass(getActivity(), CustomTabEditorActivity.class);
intent.putExtra(EXTRA_ID, c.getLong(c.getColumnIndex(Tabs._ID)));
intent.putExtra(EXTRA_TYPE, c.getString(c.getColumnIndex(Tabs.TYPE)));
intent.putExtra(EXTRA_NAME, c.getString(c.getColumnIndex(Tabs.NAME)));
intent.putExtra(EXTRA_ICON, c.getString(c.getColumnIndex(Tabs.ICON)));
intent.putExtra(EXTRA_EXTRAS, c.getString(c.getColumnIndex(Tabs.EXTRAS)));
startActivityForResult(intent, REQUEST_EDIT_TAB);
}
@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id) {
final Cursor c = mAdapter.getCursor();
c.moveToPosition(mAdapter.getCursorPosition(position));
final Intent intent = new Intent(INTENT_ACTION_EDIT_TAB);
intent.setClass(getActivity(), CustomTabEditorActivity.class);
intent.putExtra(EXTRA_ID, c.getLong(c.getColumnIndex(Tabs._ID)));
intent.putExtra(EXTRA_TYPE, c.getString(c.getColumnIndex(Tabs.TYPE)));
intent.putExtra(EXTRA_NAME, c.getString(c.getColumnIndex(Tabs.NAME)));
intent.putExtra(EXTRA_ICON, c.getString(c.getColumnIndex(Tabs.ICON)));
intent.putExtra(EXTRA_EXTRAS, c.getString(c.getColumnIndex(Tabs.EXTRAS)));
startActivityForResult(intent, REQUEST_EDIT_TAB);
}
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
mAdapter.changeCursor(null);
}
@Override
public void onLoaderReset(final Loader<Cursor> loader) {
mAdapter.changeCursor(null);
}
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor cursor) {
mAdapter.changeCursor(cursor);
setListShown(true);
}
@Override
public void onLoadFinished(final Loader<Cursor> loader, final Cursor cursor) {
mAdapter.changeCursor(cursor);
setListShown(true);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
default: {
final Intent intent = item.getIntent();
if (intent == null) return false;
startActivityForResult(intent, REQUEST_ADD_TAB);
return true;
}
}
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
default: {
final Intent intent = item.getIntent();
if (intent == null) return false;
startActivityForResult(intent, REQUEST_ADD_TAB);
return true;
}
}
}
@Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
updateTitle(mode);
return true;
}
@Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
updateTitle(mode);
return true;
}
@Override
public void onPrepareOptionsMenu(final Menu menu) {
final Resources res = getResources();
final boolean hasOfficialKeyAccounts = Utils.hasAccountSignedWithOfficialKeys(getActivity());
final long[] account_ids = getAccountIds(getActivity());
final MenuItem itemAdd = menu.findItem(R.id.add_submenu);
if (itemAdd != null && itemAdd.hasSubMenu()) {
final SubMenu subMenu = itemAdd.getSubMenu();
subMenu.clear();
final HashMap<String, CustomTabConfiguration> map = getConfiguraionMap();
final List<Entry<String, CustomTabConfiguration>> tabs = new ArrayList<Entry<String, CustomTabConfiguration>>(
map.entrySet());
Collections.sort(tabs, CustomTabConfigurationComparator.SINGLETON);
for (final Entry<String, CustomTabConfiguration> entry : tabs) {
final String type = entry.getKey();
final CustomTabConfiguration conf = entry.getValue();
@Override
public void onPrepareOptionsMenu(final Menu menu) {
final Resources res = getResources();
final boolean hasOfficialKeyAccounts = Utils.hasAccountSignedWithOfficialKeys(getActivity());
final long[] account_ids = getAccountIds(getActivity());
final MenuItem itemAdd = menu.findItem(R.id.add_submenu);
if (itemAdd != null && itemAdd.hasSubMenu()) {
final SubMenu subMenu = itemAdd.getSubMenu();
subMenu.clear();
final HashMap<String, CustomTabConfiguration> map = getConfiguraionMap();
final List<Entry<String, CustomTabConfiguration>> tabs = new ArrayList<Entry<String, CustomTabConfiguration>>(
map.entrySet());
Collections.sort(tabs, CustomTabConfigurationComparator.SINGLETON);
for (final Entry<String, CustomTabConfiguration> entry : tabs) {
final String type = entry.getKey();
final CustomTabConfiguration conf = entry.getValue();
final boolean isOfficiakKeyAccountRequired = TAB_TYPE_ACTIVITIES_ABOUT_ME.equals(type)
|| TAB_TYPE_ACTIVITIES_BY_FRIENDS.equals(type);
final boolean accountIdRequired = conf.getAccountRequirement() == CustomTabConfiguration.ACCOUNT_REQUIRED;
final boolean isOfficiakKeyAccountRequired = TAB_TYPE_ACTIVITIES_ABOUT_ME.equals(type)
|| TAB_TYPE_ACTIVITIES_BY_FRIENDS.equals(type);
final boolean accountIdRequired = conf.getAccountRequirement() == CustomTabConfiguration.ACCOUNT_REQUIRED;
final Intent intent = new Intent(INTENT_ACTION_ADD_TAB);
intent.setClass(getActivity(), CustomTabEditorActivity.class);
intent.putExtra(EXTRA_TYPE, type);
intent.putExtra(EXTRA_OFFICIAL_KEY_ONLY, isOfficiakKeyAccountRequired);
final Intent intent = new Intent(INTENT_ACTION_ADD_TAB);
intent.setClass(getActivity(), CustomTabEditorActivity.class);
intent.putExtra(EXTRA_TYPE, type);
intent.putExtra(EXTRA_OFFICIAL_KEY_ONLY, isOfficiakKeyAccountRequired);
final MenuItem subItem = subMenu.add(conf.getDefaultTitle());
final boolean shouldDisable = conf.isSingleTab() && isTabAdded(getActivity(), type)
|| isOfficiakKeyAccountRequired && !hasOfficialKeyAccounts || accountIdRequired
&& account_ids.length == 0;
subItem.setVisible(!shouldDisable);
subItem.setEnabled(!shouldDisable);
final Drawable icon = res.getDrawable(conf.getDefaultIcon());
subItem.setIcon(icon);
subItem.setIntent(intent);
}
}
}
final MenuItem subItem = subMenu.add(conf.getDefaultTitle());
final boolean shouldDisable = conf.isSingleTab() && isTabAdded(getActivity(), type)
|| isOfficiakKeyAccountRequired && !hasOfficialKeyAccounts || accountIdRequired
&& account_ids.length == 0;
subItem.setVisible(!shouldDisable);
subItem.setEnabled(!shouldDisable);
final Drawable icon = res.getDrawable(conf.getDefaultIcon());
subItem.setIcon(icon);
subItem.setIntent(intent);
}
}
}
@Override
public void onStop() {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onStop();
}
@Override
public void onStop() {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
super.onStop();
}
private void saveTabPositions() {
final ArrayList<Integer> positions = mAdapter.getCursorPositions();
final Cursor c = mAdapter.getCursor();
if (positions != null && c != null && !c.isClosed()) {
final int idIdx = c.getColumnIndex(Tabs._ID);
for (int i = 0, j = positions.size(); i < j; i++) {
c.moveToPosition(positions.get(i));
final long id = c.getLong(idIdx);
final ContentValues values = new ContentValues();
values.put(Tabs.POSITION, i);
final String where = Tabs._ID + " = " + id;
mResolver.update(Tabs.CONTENT_URI, values, where, null);
}
}
}
private void saveTabPositions() {
final ArrayList<Integer> positions = mAdapter.getCursorPositions();
final Cursor c = mAdapter.getCursor();
if (positions != null && c != null && !c.isClosed()) {
final int idIdx = c.getColumnIndex(Tabs._ID);
for (int i = 0, j = positions.size(); i < j; i++) {
c.moveToPosition(positions.get(i));
final long id = c.getLong(idIdx);
final ContentValues values = new ContentValues();
values.put(Tabs.POSITION, i);
final String where = Tabs._ID + " = " + id;
mResolver.update(Tabs.CONTENT_URI, values, where, null);
}
}
}
private void updateTitle(final ActionMode mode) {
if (mListView == null || mode == null || getActivity() == null) return;
final int count = mListView.getCheckedItemCount();
mode.setTitle(getResources().getQuantityString(R.plurals.Nitems_selected, count, count));
}
private void updateTitle(final ActionMode mode) {
if (mListView == null || mode == null || getActivity() == null) return;
final int count = mListView.getCheckedItemCount();
mode.setTitle(getResources().getQuantityString(R.plurals.Nitems_selected, count, count));
}
public static class CustomTabsAdapter extends SimpleDragSortCursorAdapter implements OnClickListener {
public static class CustomTabsAdapter extends SimpleDragSortCursorAdapter implements OnClickListener {
private CursorIndices mIndices;
private CursorIndices mIndices;
public CustomTabsAdapter(final Context context) {
super(context, R.layout.list_item_custom_tab, null, new String[0], new int[0], 0);
}
public CustomTabsAdapter(final Context context) {
super(context, R.layout.list_item_custom_tab, null, new String[0], new int[0], 0);
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
super.bindView(view, context, cursor);
final TwoLineWithIconViewHolder holder = (TwoLineWithIconViewHolder) view.getTag();
final String type = cursor.getString(mIndices.type);
final String name = cursor.getString(mIndices.name);
final String iconKey = cursor.getString(mIndices.icon);
if (isTabTypeValid(type)) {
final String typeName = getTabTypeName(context, type);
holder.text1.setText(TextUtils.isEmpty(name) ? typeName : name);
holder.text1.setPaintFlags(holder.text1.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
holder.text2.setVisibility(View.VISIBLE);
holder.text2.setText(typeName);
} else {
holder.text1.setText(name);
holder.text1.setPaintFlags(holder.text1.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
holder.text2.setText(R.string.invalid_tab);
}
final Drawable icon = getTabIconDrawable(context, getTabIconObject(iconKey));
holder.icon.setVisibility(View.VISIBLE);
if (icon != null) {
ViewAccessor.setBackground(holder.icon, icon);
} else {
holder.icon.setBackgroundResource(R.drawable.ic_iconic_action_list);
}
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
super.bindView(view, context, cursor);
final TwoLineWithIconViewHolder holder = (TwoLineWithIconViewHolder) view.getTag();
final String type = cursor.getString(mIndices.type);
final String name = cursor.getString(mIndices.name);
final String iconKey = cursor.getString(mIndices.icon);
if (isTabTypeValid(type)) {
final String typeName = getTabTypeName(context, type);
holder.text1.setText(TextUtils.isEmpty(name) ? typeName : name);
holder.text1.setPaintFlags(holder.text1.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
holder.text2.setVisibility(View.VISIBLE);
holder.text2.setText(typeName);
} else {
holder.text1.setText(name);
holder.text1.setPaintFlags(holder.text1.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
holder.text2.setText(R.string.invalid_tab);
}
final Drawable icon = getTabIconDrawable(context, getTabIconObject(iconKey));
holder.icon.setVisibility(View.VISIBLE);
if (icon != null) {
ViewAccessor.setBackground(holder.icon, icon);
} else {
holder.icon.setBackgroundResource(R.drawable.ic_iconic_action_list);
}
}
@Override
public void changeCursor(final Cursor cursor) {
if (cursor != null) {
mIndices = new CursorIndices(cursor);
}
super.changeCursor(cursor);
}
@Override
public void changeCursor(final Cursor cursor) {
if (cursor != null) {
mIndices = new CursorIndices(cursor);
}
super.changeCursor(cursor);
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final View view = super.newView(context, cursor, parent);
final Object tag = view.getTag();
if (!(tag instanceof TwoLineWithIconViewHolder)) {
final TwoLineWithIconViewHolder holder = new TwoLineWithIconViewHolder(view);
view.setTag(holder);
}
return view;
}
@Override
public View newView(final Context context, final Cursor cursor, final ViewGroup parent) {
final View view = super.newView(context, cursor, parent);
final Object tag = view.getTag();
if (!(tag instanceof TwoLineWithIconViewHolder)) {
final TwoLineWithIconViewHolder holder = new TwoLineWithIconViewHolder(view);
view.setTag(holder);
}
return view;
}
@Override
public void onClick(final View view) {
@Override
public void onClick(final View view) {
}
}
static class CursorIndices {
final int _id, name, icon, type, arguments;
static class CursorIndices {
final int _id, name, icon, type, arguments;
CursorIndices(final Cursor mCursor) {
_id = mCursor.getColumnIndex(Tabs._ID);
icon = mCursor.getColumnIndex(Tabs.ICON);
name = mCursor.getColumnIndex(Tabs.NAME);
type = mCursor.getColumnIndex(Tabs.TYPE);
arguments = mCursor.getColumnIndex(Tabs.ARGUMENTS);
}
}
CursorIndices(final Cursor mCursor) {
_id = mCursor.getColumnIndex(Tabs._ID);
icon = mCursor.getColumnIndex(Tabs.ICON);
name = mCursor.getColumnIndex(Tabs.NAME);
type = mCursor.getColumnIndex(Tabs.TYPE);
arguments = mCursor.getColumnIndex(Tabs.ARGUMENTS);
}
}
}
}
}

View File

@ -36,7 +36,6 @@ import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@ -104,7 +103,7 @@ public class HostMappingsListFragment extends BaseListFragment implements MultiC
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
new MenuInflater(getActivity()).inflate(R.menu.action_multi_select_items, menu);
new TwidereMenuInflater(getActivity()).inflate(R.menu.action_multi_select_items, menu);
return true;
}

View File

@ -243,7 +243,7 @@ public class AccountsDrawerFragment extends BaseSupportListFragment implements L
break;
}
case MENU_SET_AS_DEFAULT: {
mPreferences.edit().putLong(KEY_DEFAULT_ACCOUNT_ID, account.account_id).commit();
mPreferences.edit().putLong(KEY_DEFAULT_ACCOUNT_ID, account.account_id).apply();
break;
}
case MENU_DELETE: {

View File

@ -2,23 +2,23 @@ package org.mariotaku.twidere.fragment.support;
import android.content.Context;
import android.view.Menu;
import android.view.MenuInflater;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.model.Account;
import org.mariotaku.twidere.model.Account.AccountWithCredentials;
import org.mariotaku.twidere.model.ParcelableUser;
public class IncomingFriendshipsMenuDialogFragment extends UserMenuDialogFragment {
@Override
protected void onPrepareItemMenu(final Menu menu, final ParcelableUser user) {
final Context context = getThemedContext();
final AccountWithCredentials account = Account.getAccountWithCredentials(context, user.account_id);
if (AccountWithCredentials.isOfficialCredentials(context, account)) {
final MenuInflater inflater = new MenuInflater(context);
inflater.inflate(R.menu.action_incoming_friendship, menu);
}
}
@Override
protected void onPrepareItemMenu(final Menu menu, final ParcelableUser user) {
final Context context = getThemedContext();
final AccountWithCredentials account = Account.getAccountWithCredentials(context, user.account_id);
if (AccountWithCredentials.isOfficialCredentials(context, account)) {
final TwidereMenuInflater inflater = new TwidereMenuInflater(context);
inflater.inflate(R.menu.action_incoming_friendship, menu);
}
}
}

View File

@ -1,29 +1,29 @@
package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.MenuDialogFragment;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.util.Utils.setMenuForStatus;
public class StatusMenuDialogFragment extends MenuDialogFragment {
@Override
protected void onCreateMenu(final MenuInflater inflater, final Menu menu) {
inflater.inflate(R.menu.action_status, menu);
final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final Bundle args = getArguments();
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
setMenuForStatus(getThemedContext(), menu, status);
final boolean longclickToOpenMenu = prefs.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
}
@Override
protected void onCreateMenu(final TwidereMenuInflater inflater, final Menu menu) {
inflater.inflate(R.menu.action_status, menu);
final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final Bundle args = getArguments();
final ParcelableStatus status = args.getParcelable(EXTRA_STATUS);
setMenuForStatus(getThemedContext(), menu, status);
final boolean longclickToOpenMenu = prefs.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
}
}

View File

@ -1,42 +1,42 @@
package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.MenuDialogFragment;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.model.ParcelableUserList;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
public class UserListMenuDialogFragment extends MenuDialogFragment {
@Override
protected void onCreateMenu(final MenuInflater inflater, final Menu menu) {
final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final Bundle args = getArguments();
final ParcelableUserList user = args.getParcelable(EXTRA_USER_LIST);
inflater.inflate(R.menu.action_user_list, menu);
onPrepareItemMenu(menu, user);
final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST);
final Bundle extensionsExtras = new Bundle();
extensionsExtras.putParcelable(EXTRA_USER_LIST, user);
extensionsIntent.putExtras(extensionsExtras);
addIntentToMenu(getThemedContext(), menu, extensionsIntent);
final boolean longclickToOpenMenu = prefs.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
}
@Override
protected void onCreateMenu(final TwidereMenuInflater inflater, final Menu menu) {
final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final Bundle args = getArguments();
final ParcelableUserList user = args.getParcelable(EXTRA_USER_LIST);
inflater.inflate(R.menu.action_user_list, menu);
onPrepareItemMenu(menu, user);
final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER_LIST);
final Bundle extensionsExtras = new Bundle();
extensionsExtras.putParcelable(EXTRA_USER_LIST, user);
extensionsIntent.putExtras(extensionsExtras);
addIntentToMenu(getThemedContext(), menu, extensionsIntent);
final boolean longclickToOpenMenu = prefs.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
}
protected void onPrepareItemMenu(final Menu menu, final ParcelableUserList userList) {
if (userList == null) return;
final boolean isMyList = userList.user_id == userList.account_id;
Utils.setMenuItemAvailability(menu, MENU_ADD, isMyList);
Utils.setMenuItemAvailability(menu, MENU_DELETE, isMyList);
}
protected void onPrepareItemMenu(final Menu menu, final ParcelableUserList userList) {
if (userList == null) return;
final boolean isMyList = userList.user_id == userList.account_id;
Utils.setMenuItemAvailability(menu, MENU_ADD, isMyList);
Utils.setMenuItemAvailability(menu, MENU_DELETE, isMyList);
}
}

View File

@ -1,37 +1,37 @@
package org.mariotaku.twidere.fragment.support;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import org.mariotaku.twidere.activity.support.MenuDialogFragment;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.model.ParcelableUser;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.util.Utils.addIntentToMenu;
public class UserMenuDialogFragment extends MenuDialogFragment {
@Override
protected void onCreateMenu(final MenuInflater inflater, final Menu menu) {
final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final Bundle args = getArguments();
final ParcelableUser user = args.getParcelable(EXTRA_USER);
onPrepareItemMenu(menu, user);
final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER);
final Bundle extensionsExtras = new Bundle();
extensionsExtras.putParcelable(EXTRA_USER, user);
extensionsIntent.putExtras(extensionsExtras);
addIntentToMenu(getThemedContext(), menu, extensionsIntent);
final boolean longclickToOpenMenu = prefs.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
}
@Override
protected void onCreateMenu(final TwidereMenuInflater inflater, final Menu menu) {
final SharedPreferences prefs = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final Bundle args = getArguments();
final ParcelableUser user = args.getParcelable(EXTRA_USER);
onPrepareItemMenu(menu, user);
final Intent extensionsIntent = new Intent(INTENT_ACTION_EXTENSION_OPEN_USER);
final Bundle extensionsExtras = new Bundle();
extensionsExtras.putParcelable(EXTRA_USER, user);
extensionsIntent.putExtras(extensionsExtras);
addIntentToMenu(getThemedContext(), menu, extensionsIntent);
final boolean longclickToOpenMenu = prefs.getBoolean(KEY_LONG_CLICK_TO_OPEN_MENU, false);
Utils.setMenuItemAvailability(menu, MENU_MULTI_SELECT, longclickToOpenMenu);
}
protected void onPrepareItemMenu(final Menu menu, final ParcelableUser user) {
protected void onPrepareItemMenu(final Menu menu, final ParcelableUser user) {
}
}
}

View File

@ -27,6 +27,7 @@ import android.util.Xml;
import android.view.ActionProvider;
import android.view.InflateException;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
@ -48,7 +49,7 @@ import java.lang.reflect.Method;
* it only works with an XmlPullParser returned from a compiled resource (R.
* <em>something</em> file.)
*/
public class TwidereMenuInflater {
public class TwidereMenuInflater extends MenuInflater {
private static final String LOG_TAG = "MenuInflater";
/**
@ -96,6 +97,7 @@ public class TwidereMenuInflater {
* @see Activity#getMenuInflater()
*/
public TwidereMenuInflater(Context context, Object realOwner) {
super(context);
mContext = context;
mResources = context.getResources();
mRealOwner = realOwner;
@ -112,6 +114,7 @@ public class TwidereMenuInflater {
* @param menu The Menu to inflate into. The items and submenus will be
* added to this Menu.
*/
@Override
public void inflate(int menuRes, Menu menu) {
XmlResourceParser parser = null;
try {

View File

@ -107,7 +107,7 @@ public class AsyncTaskManager {
return false;
}
public boolean isExcuting(final int hashCode) {
public boolean isExecuting(final int hashCode) {
final ManagedAsyncTask<?, ?, ?> task = findTask(hashCode);
if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) return true;
return false;

View File

@ -19,8 +19,6 @@
package org.mariotaku.twidere.util;
import static org.mariotaku.twidere.util.Utils.getBestBannerType;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.widget.ImageView;
@ -33,72 +31,78 @@ import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.imageloader.AccountExtra;
import static org.mariotaku.twidere.util.Utils.getBestBannerType;
public class ImageLoaderWrapper implements Constants {
private final ImageLoader mImageLoader;
private final DisplayImageOptions mProfileImageDisplayOptions, mImageDisplayOptions, mBannerDisplayOptions;
private final ImageLoader mImageLoader;
private final DisplayImageOptions mProfileImageDisplayOptions, mImageDisplayOptions, mBannerDisplayOptions;
public ImageLoaderWrapper(final ImageLoader loader) {
mImageLoader = loader;
final DisplayImageOptions.Builder profileOptsNuilder = new DisplayImageOptions.Builder();
profileOptsNuilder.cacheInMemory(true);
profileOptsNuilder.cacheOnDisk(true);
profileOptsNuilder.showImageForEmptyUri(R.drawable.ic_profile_image_default);
profileOptsNuilder.showImageOnFail(R.drawable.ic_profile_image_default);
profileOptsNuilder.showImageOnLoading(R.drawable.ic_profile_image_default);
profileOptsNuilder.bitmapConfig(Bitmap.Config.ARGB_8888);
profileOptsNuilder.resetViewBeforeLoading(true);
final DisplayImageOptions.Builder imageOptsBuilder = new DisplayImageOptions.Builder();
imageOptsBuilder.cacheInMemory(true);
imageOptsBuilder.cacheOnDisk(true);
imageOptsBuilder.bitmapConfig(Bitmap.Config.RGB_565);
imageOptsBuilder.resetViewBeforeLoading(true);
final DisplayImageOptions.Builder bannerOptsBuilder = new DisplayImageOptions.Builder();
bannerOptsBuilder.cacheInMemory(true);
bannerOptsBuilder.cacheOnDisk(true);
bannerOptsBuilder.bitmapConfig(Bitmap.Config.RGB_565);
bannerOptsBuilder.resetViewBeforeLoading(true);
public ImageLoaderWrapper(final ImageLoader loader) {
mImageLoader = loader;
final DisplayImageOptions.Builder profileOptsNuilder = new DisplayImageOptions.Builder();
profileOptsNuilder.cacheInMemory(true);
profileOptsNuilder.cacheOnDisk(true);
profileOptsNuilder.showImageForEmptyUri(R.drawable.ic_profile_image_default);
profileOptsNuilder.showImageOnFail(R.drawable.ic_profile_image_default);
profileOptsNuilder.showImageOnLoading(R.drawable.ic_profile_image_default);
profileOptsNuilder.bitmapConfig(Bitmap.Config.ARGB_8888);
profileOptsNuilder.resetViewBeforeLoading(true);
final DisplayImageOptions.Builder imageOptsBuilder = new DisplayImageOptions.Builder();
imageOptsBuilder.cacheInMemory(true);
imageOptsBuilder.cacheOnDisk(true);
imageOptsBuilder.bitmapConfig(Bitmap.Config.RGB_565);
imageOptsBuilder.resetViewBeforeLoading(true);
final DisplayImageOptions.Builder bannerOptsBuilder = new DisplayImageOptions.Builder();
bannerOptsBuilder.cacheInMemory(true);
bannerOptsBuilder.cacheOnDisk(true);
bannerOptsBuilder.bitmapConfig(Bitmap.Config.RGB_565);
bannerOptsBuilder.resetViewBeforeLoading(true);
mProfileImageDisplayOptions = profileOptsNuilder.build();
mImageDisplayOptions = imageOptsBuilder.build();
mBannerDisplayOptions = bannerOptsBuilder.build();
}
mProfileImageDisplayOptions = profileOptsNuilder.build();
mImageDisplayOptions = imageOptsBuilder.build();
mBannerDisplayOptions = bannerOptsBuilder.build();
}
public void clearFileCache() {
mImageLoader.clearDiskCache();
}
public void clearFileCache() {
mImageLoader.clearDiskCache();
}
public void clearMemoryCache() {
mImageLoader.clearMemoryCache();
}
public void clearMemoryCache() {
mImageLoader.clearMemoryCache();
}
public void displayPreviewImage(final ImageView view, final String url) {
mImageLoader.displayImage(url, view, mImageDisplayOptions);
}
public void displayPreviewImage(final ImageView view, final String url) {
mImageLoader.displayImage(url, view, mImageDisplayOptions);
}
public void displayPreviewImage(final ImageView view, final String url, final ImageLoadingHandler loadingHandler) {
mImageLoader.displayImage(url, view, mImageDisplayOptions, loadingHandler, loadingHandler);
}
public void displayPreviewImage(final ImageView view, final String url, final ImageLoadingHandler loadingHandler) {
mImageLoader.displayImage(url, view, mImageDisplayOptions, loadingHandler, loadingHandler);
}
public void displayPreviewImageWithCredentials(final ImageView view, final String url, final long accountId,
final ImageLoadingHandler loadingHandler) {
final DisplayImageOptions.Builder b = new DisplayImageOptions.Builder();
b.cloneFrom(mImageDisplayOptions);
b.extraForDownloader(new AccountExtra(accountId));
mImageLoader.displayImage(url, view, b.build(), loadingHandler, loadingHandler);
}
public void displayPreviewImageWithCredentials(final ImageView view, final String url, final long accountId,
final ImageLoadingHandler loadingHandler) {
final DisplayImageOptions.Builder b = new DisplayImageOptions.Builder();
b.cloneFrom(mImageDisplayOptions);
b.extraForDownloader(new AccountExtra(accountId));
mImageLoader.displayImage(url, view, b.build(), loadingHandler, loadingHandler);
}
public void displayProfileBanner(final ImageView view, final String base_url, final int width) {
final String type = getBestBannerType(width);
final String url = TextUtils.isEmpty(base_url) ? null : base_url + "/" + type;
mImageLoader.displayImage(url, view, mBannerDisplayOptions);
}
public void displayProfileBanner(final ImageView view, final String base_url, final int width) {
final String type = getBestBannerType(width);
final String url = TextUtils.isEmpty(base_url) ? null : base_url + "/" + type;
mImageLoader.displayImage(url, view, mBannerDisplayOptions);
}
public void displayProfileImage(final ImageView view, final String url) {
mImageLoader.displayImage(url, view, mProfileImageDisplayOptions);
}
public void displayProfileImage(final ImageView view, final String url) {
mImageLoader.displayImage(url, view, mProfileImageDisplayOptions);
}
public void loadProfileImage(final String url, final ImageLoadingListener listener) {
mImageLoader.loadImage(url, mProfileImageDisplayOptions, listener);
}
public void loadProfileImage(final String url, final ImageLoadingListener listener) {
mImageLoader.loadImage(url, mProfileImageDisplayOptions, listener);
}
public void cancelDisplayTask(ImageView imageView) {
mImageLoader.cancelDisplayTask(imageView);
}
}

View File

@ -19,11 +19,6 @@
package org.mariotaku.twidere.util;
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;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.ContentValues;
@ -31,19 +26,16 @@ import android.content.Intent;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.twitter.Extractor;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.CroutonStyle;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseSupportActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.menu.AccountActionProvider;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
import org.mariotaku.twidere.model.Account;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.model.ParcelableUser;
@ -57,198 +49,206 @@ import java.util.List;
import java.util.Set;
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;
@SuppressLint("Registered")
public class MultiSelectEventHandler implements Constants, ActionMode.Callback, MultiSelectManager.Callback {
private TwidereApplication mApplication;
private TwidereApplication mApplication;
private AsyncTwitterWrapper mTwitterWrapper;
private AsyncTwitterWrapper mTwitterWrapper;
private MultiSelectManager mMultiSelectManager;
private MultiSelectManager mMultiSelectManager;
private ActionMode mActionMode;
private ActionMode mActionMode;
private final BaseSupportActivity mActivity;
private final BaseSupportActivity mActivity;
private AccountActionProvider mAccountActionProvider;
private AccountActionProvider mAccountActionProvider;
public static final int MENU_GROUP = 201;
public static final int MENU_GROUP = 201;
public MultiSelectEventHandler(final BaseSupportActivity activity) {
mActivity = activity;
}
public MultiSelectEventHandler(final BaseSupportActivity activity) {
mActivity = activity;
}
/**
* Call before super.onCreate
*/
public void dispatchOnCreate() {
mApplication = mActivity.getTwidereApplication();
mTwitterWrapper = mApplication.getTwitterWrapper();
mMultiSelectManager = mApplication.getMultiSelectManager();
}
/**
* Call before super.onCreate
*/
public void dispatchOnCreate() {
mApplication = mActivity.getTwidereApplication();
mTwitterWrapper = mApplication.getTwitterWrapper();
mMultiSelectManager = mApplication.getMultiSelectManager();
}
/**
* Call after super.onStart
*/
public void dispatchOnStart() {
mMultiSelectManager.registerCallback(this);
updateMultiSelectState();
}
/**
* Call after super.onStart
*/
public void dispatchOnStart() {
mMultiSelectManager.registerCallback(this);
updateMultiSelectState();
}
/**
* Call before super.onStop
*/
public void dispatchOnStop() {
mMultiSelectManager.unregisterCallback(this);
}
/**
* Call before super.onStop
*/
public void dispatchOnStop() {
mMultiSelectManager.unregisterCallback(this);
}
@Override
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
final List<Object> selectedItems = mMultiSelectManager.getSelectedItems();
if (selectedItems.isEmpty()) return false;
switch (item.getItemId()) {
case MENU_REPLY: {
final Extractor extractor = new Extractor();
final Intent intent = new Intent(INTENT_ACTION_REPLY_MULTIPLE);
final Bundle bundle = new Bundle();
final String[] accountScreenNames = getAccountScreenNames(mActivity);
final Collection<String> allMentions = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
for (final Object object : selectedItems) {
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
allMentions.add(status.user_screen_name);
allMentions.addAll(extractor.extractMentionedScreennames(status.text_plain));
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
allMentions.add(user.screen_name);
}
}
allMentions.removeAll(Arrays.asList(accountScreenNames));
final Object firstObj = selectedItems.get(0);
if (firstObj instanceof ParcelableStatus) {
final ParcelableStatus first_status = (ParcelableStatus) firstObj;
bundle.putLong(EXTRA_IN_REPLY_TO_ID, first_status.id);
}
bundle.putLong(EXTRA_ACCOUNT_ID, mMultiSelectManager.getAccountId());
bundle.putStringArray(EXTRA_SCREEN_NAMES, allMentions.toArray(new String[allMentions.size()]));
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivity(intent);
mode.finish();
break;
}
case MENU_MUTE_USER: {
final ContentResolver resolver = mActivity.getContentResolver();
final ArrayList<ContentValues> valuesList = new ArrayList<ContentValues>();
final Set<Long> userIds = new HashSet<Long>();
for (final Object object : selectedItems) {
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
userIds.add(status.user_id);
valuesList.add(makeFilterdUserContentValues(status));
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
userIds.add(user.id);
valuesList.add(makeFilterdUserContentValues(user));
} else {
continue;
}
}
bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.USER_ID, userIds, null, false);
bulkInsert(resolver, Filters.Users.CONTENT_URI, valuesList);
Crouton.showText(mActivity, R.string.message_users_muted, CroutonStyle.INFO);
mode.finish();
mActivity.sendBroadcast(new Intent(BROADCAST_MULTI_MUTESTATE_CHANGED));
break;
}
case MENU_BLOCK: {
final long accountId = mMultiSelectManager.getAccountId();
final long[] userIds = MultiSelectManager.getSelectedUserIds(selectedItems);
if (accountId > 0 && userIds != null) {
mTwitterWrapper.createMultiBlockAsync(accountId, userIds);
}
mode.finish();
break;
}
case MENU_REPORT_SPAM: {
final long accountId = mMultiSelectManager.getAccountId();
final long[] userIds = MultiSelectManager.getSelectedUserIds(selectedItems);
if (accountId > 0 && userIds != null) {
mTwitterWrapper.reportMultiSpam(accountId, userIds);
}
mode.finish();
break;
}
}
if (item.getGroupId() == AccountActionProvider.MENU_GROUP) {
final Intent intent = item.getIntent();
if (intent == null || !intent.hasExtra(EXTRA_ACCOUNT)) return false;
final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
mMultiSelectManager.setAccountId(account.account_id);
if (mAccountActionProvider != null) {
mAccountActionProvider.setAccountId(account.account_id);
}
mode.invalidate();
}
return true;
}
@Override
public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) {
final List<Object> selectedItems = mMultiSelectManager.getSelectedItems();
if (selectedItems.isEmpty()) return false;
switch (item.getItemId()) {
case MENU_REPLY: {
final Extractor extractor = new Extractor();
final Intent intent = new Intent(INTENT_ACTION_REPLY_MULTIPLE);
final Bundle bundle = new Bundle();
final String[] accountScreenNames = getAccountScreenNames(mActivity);
final Collection<String> allMentions = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
for (final Object object : selectedItems) {
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
allMentions.add(status.user_screen_name);
allMentions.addAll(extractor.extractMentionedScreennames(status.text_plain));
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
allMentions.add(user.screen_name);
}
}
allMentions.removeAll(Arrays.asList(accountScreenNames));
final Object firstObj = selectedItems.get(0);
if (firstObj instanceof ParcelableStatus) {
final ParcelableStatus first_status = (ParcelableStatus) firstObj;
bundle.putLong(EXTRA_IN_REPLY_TO_ID, first_status.id);
}
bundle.putLong(EXTRA_ACCOUNT_ID, mMultiSelectManager.getAccountId());
bundle.putStringArray(EXTRA_SCREEN_NAMES, allMentions.toArray(new String[allMentions.size()]));
intent.putExtras(bundle);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mActivity.startActivity(intent);
mode.finish();
break;
}
case MENU_MUTE_USER: {
final ContentResolver resolver = mActivity.getContentResolver();
final ArrayList<ContentValues> valuesList = new ArrayList<ContentValues>();
final Set<Long> userIds = new HashSet<Long>();
for (final Object object : selectedItems) {
if (object instanceof ParcelableStatus) {
final ParcelableStatus status = (ParcelableStatus) object;
userIds.add(status.user_id);
valuesList.add(makeFilterdUserContentValues(status));
} else if (object instanceof ParcelableUser) {
final ParcelableUser user = (ParcelableUser) object;
userIds.add(user.id);
valuesList.add(makeFilterdUserContentValues(user));
} else {
continue;
}
}
bulkDelete(resolver, Filters.Users.CONTENT_URI, Filters.Users.USER_ID, userIds, null, false);
bulkInsert(resolver, Filters.Users.CONTENT_URI, valuesList);
Crouton.showText(mActivity, R.string.message_users_muted, CroutonStyle.INFO);
mode.finish();
mActivity.sendBroadcast(new Intent(BROADCAST_MULTI_MUTESTATE_CHANGED));
break;
}
case MENU_BLOCK: {
final long accountId = mMultiSelectManager.getAccountId();
final long[] userIds = MultiSelectManager.getSelectedUserIds(selectedItems);
if (accountId > 0 && userIds != null) {
mTwitterWrapper.createMultiBlockAsync(accountId, userIds);
}
mode.finish();
break;
}
case MENU_REPORT_SPAM: {
final long accountId = mMultiSelectManager.getAccountId();
final long[] userIds = MultiSelectManager.getSelectedUserIds(selectedItems);
if (accountId > 0 && userIds != null) {
mTwitterWrapper.reportMultiSpam(accountId, userIds);
}
mode.finish();
break;
}
}
if (item.getGroupId() == AccountActionProvider.MENU_GROUP) {
final Intent intent = item.getIntent();
if (intent == null || !intent.hasExtra(EXTRA_ACCOUNT)) return false;
final Account account = intent.getParcelableExtra(EXTRA_ACCOUNT);
mMultiSelectManager.setAccountId(account.account_id);
if (mAccountActionProvider != null) {
mAccountActionProvider.setAccountId(account.account_id);
}
mode.invalidate();
}
return true;
}
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
new MenuInflater(mActivity).inflate(R.menu.action_multi_select_contents, menu);
mAccountActionProvider = (AccountActionProvider) menu.findItem(MENU_SELECT_ACCOUNT).getActionProvider();
mAccountActionProvider.setAccountId(mMultiSelectManager.getFirstSelectAccountId());
return true;
}
@Override
public boolean onCreateActionMode(final ActionMode mode, final Menu menu) {
new TwidereMenuInflater(mActivity).inflate(R.menu.action_multi_select_contents, menu);
mAccountActionProvider = (AccountActionProvider) menu.findItem(MENU_SELECT_ACCOUNT).getActionProvider();
mAccountActionProvider.setAccountId(mMultiSelectManager.getFirstSelectAccountId());
return true;
}
@Override
public void onDestroyActionMode(final ActionMode mode) {
if (mMultiSelectManager.getCount() != 0) {
mMultiSelectManager.clearSelectedItems();
}
mAccountActionProvider = null;
mActionMode = null;
}
@Override
public void onDestroyActionMode(final ActionMode mode) {
if (mMultiSelectManager.getCount() != 0) {
mMultiSelectManager.clearSelectedItems();
}
mAccountActionProvider = null;
mActionMode = null;
}
@Override
public void onItemsCleared() {
updateMultiSelectState();
}
@Override
public void onItemsCleared() {
updateMultiSelectState();
}
@Override
public void onItemSelected(final Object item) {
updateMultiSelectState();
}
@Override
public void onItemSelected(final Object item) {
updateMultiSelectState();
}
@Override
public void onItemUnselected(final Object item) {
updateMultiSelectState();
}
@Override
public void onItemUnselected(final Object item) {
updateMultiSelectState();
}
@Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
updateSelectedCount(mode);
return true;
}
@Override
public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) {
updateSelectedCount(mode);
return true;
}
private void updateMultiSelectState() {
if (mMultiSelectManager.isActive()) {
if (mActionMode == null) {
mActionMode = mActivity.startActionMode(this);
}
updateSelectedCount(mActionMode);
} else {
if (mActionMode != null) {
mActionMode.finish();
mActionMode = null;
}
}
}
private void updateMultiSelectState() {
if (mMultiSelectManager.isActive()) {
if (mActionMode == null) {
mActionMode = mActivity.startActionMode(this);
}
updateSelectedCount(mActionMode);
} else {
if (mActionMode != null) {
mActionMode.finish();
mActionMode = null;
}
}
}
private void updateSelectedCount(final ActionMode mode) {
if (mode == null || mActivity == null || mMultiSelectManager == null) return;
final int count = mMultiSelectManager.getCount();
mode.setTitle(mActivity.getResources().getQuantityString(R.plurals.Nitems_selected, count, count));
}
private void updateSelectedCount(final ActionMode mode) {
if (mode == null || mActivity == null || mMultiSelectManager == null) return;
final int count = mMultiSelectManager.getCount();
mode.setTitle(mActivity.getResources().getQuantityString(R.plurals.Nitems_selected, count, count));
}
}

View File

@ -23,7 +23,6 @@ import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
@ -32,6 +31,7 @@ import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.support.annotation.NonNull;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
@ -289,8 +289,8 @@ public class ThemeUtils implements Constants {
public static boolean getDarkActionBarOption(final Context context) {
if (context == null) return true;
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
return pref == null || pref.getBoolean(KEY_THEME_DARK_ACTIONBAR, true);
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
return pref.getBoolean(KEY_THEME_DARK_ACTIONBAR, true);
}
public static Context getDialogThemedContext(final Context context) {
@ -388,7 +388,7 @@ public class ThemeUtils implements Constants {
public static int getNoDisplayThemeResource(final Context context) {
if (context == null) return R.style.Theme_Twidere_Dark_NoDisplay;
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
final String theme = pref.getString(KEY_THEME, VALUE_THEME_NAME_TWIDERE);
if (VALUE_THEME_NAME_DARK.equals(theme)) return R.style.Theme_Twidere_Dark_NoDisplay;
return R.style.Theme_Twidere_Light_NoDisplay;
@ -396,8 +396,7 @@ public class ThemeUtils implements Constants {
public static Resources getResources(final Context context) {
if (context instanceof IThemedActivity) {
final Resources defRes = ((IThemedActivity) context).getDefaultResources();
return defRes;
return ((IThemedActivity) context).getDefaultResources();
}
return context.getResources();
}
@ -473,8 +472,7 @@ public class ThemeUtils implements Constants {
public static String getThemeBackgroundOption(final Context context) {
if (context == null) return VALUE_THEME_BACKGROUND_DEFAULT;
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
if (pref == null) return VALUE_THEME_BACKGROUND_DEFAULT;
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
return pref.getString(KEY_THEME_BACKGROUND, VALUE_THEME_BACKGROUND_DEFAULT);
}
@ -501,10 +499,10 @@ public class ThemeUtils implements Constants {
final int themeRes, accentColor;
if (context instanceof IThemedActivity) {
themeRes = ((IThemedActivity) context).getThemeResourceId();
accentColor = ((IThemedActivity) context).getThemeColor();
accentColor = ((IThemedActivity) context).getOverrideAccentColor();
} else {
themeRes = getSettingsThemeResource(context);
accentColor = getUserThemeColor(context);
accentColor = getUserThemeColor(context, themeRes);
}
return new TwidereContextThemeWrapper(context, getThemeResActionIcons(themeRes), accentColor);
}
@ -522,7 +520,7 @@ public class ThemeUtils implements Constants {
final int themeRes, accentColor;
if (context instanceof IThemedActivity) {
themeRes = ((IThemedActivity) context).getThemeResourceId();
accentColor = ((IThemedActivity) context).getThemeColor();
accentColor = ((IThemedActivity) context).getOverrideAccentColor();
} else {
themeRes = getSettingsThemeResource(context);
accentColor = getUserThemeColor(context);
@ -533,7 +531,7 @@ public class ThemeUtils implements Constants {
public static String getThemeFontFamily(final Context context) {
if (context == null) return VALUE_THEME_FONT_FAMILY_REGULAR;
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
final String fontFamily = pref.getString(KEY_THEME_FONT_FAMILY, VALUE_THEME_FONT_FAMILY_REGULAR);
if (!TextUtils.isEmpty(fontFamily)) return fontFamily;
return VALUE_THEME_FONT_FAMILY_REGULAR;
@ -550,10 +548,17 @@ public class ThemeUtils implements Constants {
}
}
@NonNull
private static SharedPreferencesWrapper getSharedPreferencesWrapper(Context context) {
final Context appContext = context.getApplicationContext();
return SharedPreferencesWrapper.getInstance(appContext, SHARED_PREFERENCES_NAME,
Context.MODE_PRIVATE);
}
public static String getThemeNameOption(final Context context) {
if (context == null) return VALUE_THEME_NAME_TWIDERE;
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
return pref != null ? pref.getString(KEY_THEME, VALUE_THEME_NAME_TWIDERE) : VALUE_THEME_NAME_TWIDERE;
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
return pref.getString(KEY_THEME, VALUE_THEME_NAME_TWIDERE);
}
public static int getThemeResActionIcons(final int baseThemeRes) {
@ -651,16 +656,23 @@ public class ThemeUtils implements Constants {
public static int getUserThemeBackgroundAlpha(final Context context) {
if (context == null) return DEFAULT_THEME_BACKGROUND_ALPHA;
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
return pref.getInt(KEY_THEME_BACKGROUND_ALPHA, DEFAULT_THEME_BACKGROUND_ALPHA);
}
public static int getUserThemeColor(final Context context) {
if (context == null) return Color.TRANSPARENT;
final Resources res = getResources(context);
final SharedPreferences pref = context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
final int def = res.getColor(android.R.color.holo_blue_light);
return pref != null ? pref.getInt(KEY_THEME_COLOR, def) : def;
return pref.getInt(KEY_THEME_COLOR, def);
}
public static int getUserThemeColor(final Context context, int themeRes) {
if (context == null) return Color.TRANSPARENT;
final int defThemeColor = getThemeColor(context, themeRes);
final SharedPreferencesWrapper pref = getSharedPreferencesWrapper(context);
return pref.getInt(KEY_THEME_COLOR, defThemeColor);
}
public static Typeface getUserTypeface(final Context context, final Typeface defTypeface) {
@ -943,4 +955,16 @@ public class ThemeUtils implements Constants {
public static Resources getThemedResourcesForActionIcons(Context context, int themeRes, int accentColor) {
return getThemedContextForActionIcons(context, themeRes, accentColor).getResources();
}
public static int getThemeColor(Context context, int themeResourceId) {
final Context appContext = context.getApplicationContext();
final Resources res = appContext.getResources();
final TypedArray a = appContext.obtainStyledAttributes(null,
new int[]{android.R.attr.colorActivatedHighlight}, 0, themeResourceId);
try {
return a.getColor(0, res.getColor(android.R.color.holo_blue_light));
} finally {
a.recycle();
}
}
}

View File

@ -19,9 +19,6 @@
package org.mariotaku.twidere.util.content;
import static org.mariotaku.twidere.util.Utils.trim;
import static org.mariotaku.twidere.util.content.DatabaseUpgradeHelper.safeUpgrade;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
@ -49,114 +46,120 @@ import org.mariotaku.twidere.util.TwidereQueryBuilder.DirectMessagesQueryBuilder
import java.util.HashMap;
import static org.mariotaku.twidere.util.Utils.trim;
import static org.mariotaku.twidere.util.content.DatabaseUpgradeHelper.safeUpgrade;
public final class TwidereSQLiteOpenHelper extends SQLiteOpenHelper implements Constants {
private final Context mContext;
private final Context mContext;
public TwidereSQLiteOpenHelper(final Context context, final String name, final int version) {
super(context, name, null, version);
mContext = context;
}
public TwidereSQLiteOpenHelper(final Context context, final String name, final int version) {
super(context, name, null, version);
mContext = context;
}
@Override
public void onCreate(final SQLiteDatabase db) {
db.beginTransaction();
db.execSQL(createTable(Accounts.TABLE_NAME, Accounts.COLUMNS, Accounts.TYPES, true));
db.execSQL(createTable(Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true));
db.execSQL(createTable(Mentions.TABLE_NAME, Mentions.COLUMNS, Mentions.TYPES, true));
db.execSQL(createTable(Drafts.TABLE_NAME, Drafts.COLUMNS, Drafts.TYPES, true));
db.execSQL(createTable(CachedUsers.TABLE_NAME, CachedUsers.COLUMNS, CachedUsers.TYPES, true));
db.execSQL(createTable(CachedStatuses.TABLE_NAME, CachedStatuses.COLUMNS, CachedStatuses.TYPES, true));
db.execSQL(createTable(CachedHashtags.TABLE_NAME, CachedHashtags.COLUMNS, CachedHashtags.TYPES, true));
db.execSQL(createTable(Filters.Users.TABLE_NAME, Filters.Users.COLUMNS, Filters.Users.TYPES, true));
db.execSQL(createTable(Filters.Keywords.TABLE_NAME, Filters.Keywords.COLUMNS, Filters.Keywords.TYPES, true));
db.execSQL(createTable(Filters.Sources.TABLE_NAME, Filters.Sources.COLUMNS, Filters.Sources.TYPES, true));
db.execSQL(createTable(Filters.Links.TABLE_NAME, Filters.Links.COLUMNS, Filters.Links.TYPES, true));
db.execSQL(createTable(DirectMessages.Inbox.TABLE_NAME, DirectMessages.Inbox.COLUMNS,
DirectMessages.Inbox.TYPES, true));
db.execSQL(createTable(DirectMessages.Outbox.TABLE_NAME, DirectMessages.Outbox.COLUMNS,
DirectMessages.Outbox.TYPES, true));
db.execSQL(createTable(CachedTrends.Local.TABLE_NAME, CachedTrends.Local.COLUMNS, CachedTrends.Local.TYPES,
true));
db.execSQL(createTable(Tabs.TABLE_NAME, Tabs.COLUMNS, Tabs.TYPES, true));
db.execSQL(createDirectMessagesView().getSQL());
db.execSQL(createDirectMessageConversationEntriesView().getSQL());
db.setTransactionSuccessful();
db.endTransaction();
}
@Override
public void onCreate(final SQLiteDatabase db) {
db.beginTransaction();
db.execSQL(createTable(Accounts.TABLE_NAME, Accounts.COLUMNS, Accounts.TYPES, true));
db.execSQL(createTable(Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true));
db.execSQL(createTable(Mentions.TABLE_NAME, Mentions.COLUMNS, Mentions.TYPES, true));
db.execSQL(createTable(Drafts.TABLE_NAME, Drafts.COLUMNS, Drafts.TYPES, true));
db.execSQL(createTable(CachedUsers.TABLE_NAME, CachedUsers.COLUMNS, CachedUsers.TYPES, true));
db.execSQL(createTable(CachedStatuses.TABLE_NAME, CachedStatuses.COLUMNS, CachedStatuses.TYPES, true));
db.execSQL(createTable(CachedHashtags.TABLE_NAME, CachedHashtags.COLUMNS, CachedHashtags.TYPES, true));
db.execSQL(createTable(Filters.Users.TABLE_NAME, Filters.Users.COLUMNS, Filters.Users.TYPES, true));
db.execSQL(createTable(Filters.Keywords.TABLE_NAME, Filters.Keywords.COLUMNS, Filters.Keywords.TYPES, true));
db.execSQL(createTable(Filters.Sources.TABLE_NAME, Filters.Sources.COLUMNS, Filters.Sources.TYPES, true));
db.execSQL(createTable(Filters.Links.TABLE_NAME, Filters.Links.COLUMNS, Filters.Links.TYPES, true));
db.execSQL(createTable(DirectMessages.Inbox.TABLE_NAME, DirectMessages.Inbox.COLUMNS,
DirectMessages.Inbox.TYPES, true));
db.execSQL(createTable(DirectMessages.Outbox.TABLE_NAME, DirectMessages.Outbox.COLUMNS,
DirectMessages.Outbox.TYPES, true));
db.execSQL(createTable(CachedTrends.Local.TABLE_NAME, CachedTrends.Local.COLUMNS, CachedTrends.Local.TYPES,
true));
db.execSQL(createTable(Tabs.TABLE_NAME, Tabs.COLUMNS, Tabs.TYPES, true));
db.execSQL(createDirectMessagesView().getSQL());
db.execSQL(createDirectMessageConversationEntriesView().getSQL());
db.setTransactionSuccessful();
db.endTransaction();
}
@Override
public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
handleVersionChange(db, oldVersion, newVersion);
}
@Override
public void onDowngrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
handleVersionChange(db, oldVersion, newVersion);
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
handleVersionChange(db, oldVersion, newVersion);
if (oldVersion <= 43 && newVersion >= 44) {
final ContentValues values = new ContentValues();
final SharedPreferences prefs = mContext
.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
// Here I use old consumer key/secret because it's default key for
// older versions
final String pref_consumer_key = prefs.getString(KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY);
final String pref_consumer_secret = prefs.getString(KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET);
values.put(Accounts.CONSUMER_KEY, trim(pref_consumer_key));
values.put(Accounts.CONSUMER_SECRET, trim(pref_consumer_secret));
db.update(Accounts.TABLE_NAME, values, null, null);
}
}
@Override
public void onUpgrade(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
handleVersionChange(db, oldVersion, newVersion);
if (oldVersion <= 43 && newVersion >= 44) {
final ContentValues values = new ContentValues();
final SharedPreferences prefs = mContext
.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
// Here I use old consumer key/secret because it's default key for
// older versions
final String pref_consumer_key = prefs.getString(KEY_CONSUMER_KEY, TWITTER_CONSUMER_KEY);
final String pref_consumer_secret = prefs.getString(KEY_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET);
values.put(Accounts.CONSUMER_KEY, trim(pref_consumer_key));
values.put(Accounts.CONSUMER_SECRET, trim(pref_consumer_secret));
db.update(Accounts.TABLE_NAME, values, null, null);
}
}
private SQLCreateViewQuery createDirectMessageConversationEntriesView() {
final SQLCreateViewQuery.Builder qb = SQLQueryBuilder.createView(true,
DirectMessages.ConversationEntries.TABLE_NAME);
qb.as(ConversationsEntryQueryBuilder.build());
return qb.build();
}
private SQLCreateViewQuery createDirectMessageConversationEntriesView() {
final SQLCreateViewQuery.Builder qb = SQLQueryBuilder.createView(true,
DirectMessages.ConversationEntries.TABLE_NAME);
qb.as(ConversationsEntryQueryBuilder.build());
return qb.build();
}
private SQLCreateViewQuery createDirectMessagesView() {
final SQLCreateViewQuery.Builder qb = SQLQueryBuilder.createView(true, DirectMessages.TABLE_NAME);
qb.as(DirectMessagesQueryBuilder.build());
return qb.build();
}
private SQLCreateViewQuery createDirectMessagesView() {
final SQLCreateViewQuery.Builder qb = SQLQueryBuilder.createView(true, DirectMessages.TABLE_NAME);
qb.as(DirectMessagesQueryBuilder.build());
return qb.build();
}
private void handleVersionChange(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
final HashMap<String, String> accountsAlias = new HashMap<String, String>();
final HashMap<String, String> filtersAlias = new HashMap<String, String>();
accountsAlias.put(Accounts.SCREEN_NAME, "username");
accountsAlias.put(Accounts.NAME, "username");
accountsAlias.put(Accounts.ACCOUNT_ID, "user_id");
accountsAlias.put(Accounts.COLOR, "user_color");
accountsAlias.put(Accounts.OAUTH_TOKEN_SECRET, "token_secret");
safeUpgrade(db, Accounts.TABLE_NAME, Accounts.COLUMNS, Accounts.TYPES, false, accountsAlias);
safeUpgrade(db, Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true, null);
safeUpgrade(db, Mentions.TABLE_NAME, Mentions.COLUMNS, Mentions.TYPES, true, null);
safeUpgrade(db, Drafts.TABLE_NAME, Drafts.COLUMNS, Drafts.TYPES, false, null);
safeUpgrade(db, CachedUsers.TABLE_NAME, CachedUsers.COLUMNS, CachedUsers.TYPES, true, null);
safeUpgrade(db, CachedStatuses.TABLE_NAME, CachedStatuses.COLUMNS, CachedStatuses.TYPES, false, null);
safeUpgrade(db, CachedHashtags.TABLE_NAME, CachedHashtags.COLUMNS, CachedHashtags.TYPES, false, null);
safeUpgrade(db, Filters.Users.TABLE_NAME, Filters.Users.COLUMNS, Filters.Users.TYPES, oldVersion < 49, null);
safeUpgrade(db, Filters.Keywords.TABLE_NAME, Filters.Keywords.COLUMNS, Filters.Keywords.TYPES, oldVersion < 49,
filtersAlias);
safeUpgrade(db, Filters.Sources.TABLE_NAME, Filters.Sources.COLUMNS, Filters.Sources.TYPES, oldVersion < 49,
filtersAlias);
safeUpgrade(db, Filters.Links.TABLE_NAME, Filters.Links.COLUMNS, Filters.Links.TYPES, oldVersion < 49,
filtersAlias);
safeUpgrade(db, DirectMessages.Inbox.TABLE_NAME, DirectMessages.Inbox.COLUMNS, DirectMessages.Inbox.TYPES,
true, null);
safeUpgrade(db, DirectMessages.Outbox.TABLE_NAME, DirectMessages.Outbox.COLUMNS, DirectMessages.Outbox.TYPES,
true, null);
safeUpgrade(db, CachedTrends.Local.TABLE_NAME, CachedTrends.Local.COLUMNS, CachedTrends.Local.TYPES, true, null);
safeUpgrade(db, Tabs.TABLE_NAME, Tabs.COLUMNS, Tabs.TYPES, false, null);
db.execSQL(createDirectMessagesView().getSQL());
db.execSQL(createDirectMessageConversationEntriesView().getSQL());
}
private void handleVersionChange(final SQLiteDatabase db, final int oldVersion, final int newVersion) {
final HashMap<String, String> accountsAlias = new HashMap<String, String>();
final HashMap<String, String> filtersAlias = new HashMap<String, String>();
accountsAlias.put(Accounts.SCREEN_NAME, "username");
accountsAlias.put(Accounts.NAME, "username");
accountsAlias.put(Accounts.ACCOUNT_ID, "user_id");
accountsAlias.put(Accounts.COLOR, "user_color");
accountsAlias.put(Accounts.OAUTH_TOKEN_SECRET, "token_secret");
safeUpgrade(db, Accounts.TABLE_NAME, Accounts.COLUMNS, Accounts.TYPES, false, accountsAlias);
safeUpgrade(db, Statuses.TABLE_NAME, Statuses.COLUMNS, Statuses.TYPES, true, null);
safeUpgrade(db, Mentions.TABLE_NAME, Mentions.COLUMNS, Mentions.TYPES, true, null);
safeUpgrade(db, Drafts.TABLE_NAME, Drafts.COLUMNS, Drafts.TYPES, false, null);
safeUpgrade(db, CachedUsers.TABLE_NAME, CachedUsers.COLUMNS, CachedUsers.TYPES, true, null);
safeUpgrade(db, CachedStatuses.TABLE_NAME, CachedStatuses.COLUMNS, CachedStatuses.TYPES, false, null);
safeUpgrade(db, CachedHashtags.TABLE_NAME, CachedHashtags.COLUMNS, CachedHashtags.TYPES, false, null);
safeUpgrade(db, Filters.Users.TABLE_NAME, Filters.Users.COLUMNS, Filters.Users.TYPES, oldVersion < 49, null);
safeUpgrade(db, Filters.Keywords.TABLE_NAME, Filters.Keywords.COLUMNS, Filters.Keywords.TYPES, oldVersion < 49,
filtersAlias);
safeUpgrade(db, Filters.Sources.TABLE_NAME, Filters.Sources.COLUMNS, Filters.Sources.TYPES, oldVersion < 49,
filtersAlias);
safeUpgrade(db, Filters.Links.TABLE_NAME, Filters.Links.COLUMNS, Filters.Links.TYPES, oldVersion < 49,
filtersAlias);
safeUpgrade(db, DirectMessages.Inbox.TABLE_NAME, DirectMessages.Inbox.COLUMNS, DirectMessages.Inbox.TYPES,
true, null);
safeUpgrade(db, DirectMessages.Outbox.TABLE_NAME, DirectMessages.Outbox.COLUMNS, DirectMessages.Outbox.TYPES,
true, null);
safeUpgrade(db, CachedTrends.Local.TABLE_NAME, CachedTrends.Local.COLUMNS, CachedTrends.Local.TYPES, true, null);
safeUpgrade(db, Tabs.TABLE_NAME, Tabs.COLUMNS, Tabs.TYPES, false, null);
db.beginTransaction();
db.execSQL(createDirectMessagesView().getSQL());
db.execSQL(createDirectMessageConversationEntriesView().getSQL());
db.setTransactionSuccessful();
db.endTransaction();
}
private static String createTable(final String tableName, final String[] columns, final String[] types,
final boolean createIfNotExists) {
final SQLCreateTableQuery.Builder qb = SQLQueryBuilder.createTable(createIfNotExists, tableName);
qb.columns(NewColumn.createNewColumns(columns, types));
return qb.buildSQL();
}
private static String createTable(final String tableName, final String[] columns, final String[] types,
final boolean createIfNotExists) {
final SQLCreateTableQuery.Builder qb = SQLQueryBuilder.createTable(createIfNotExists, tableName);
qb.columns(NewColumn.createNewColumns(columns, types));
return qb.buildSQL();
}
}

View File

@ -26,11 +26,11 @@ public class WhiteDrawableInterceptor implements AccentResources.Interceptor {
@Override
public Drawable getDrawable(final Resources res, final AccentPalette palette, final int resId) {
if (resId == R.drawable.solid_pressed_white_intercepted)
if (resId == R.drawable.solid_white_pressed)
return new ColorDrawable(mAccentPalette.getAccentColor(PRESSED_ALPHA));
if (resId == R.drawable.solid_focused_white_intercepted)
if (resId == R.drawable.solid_white_focused)
return new ColorDrawable(mAccentPalette.getAccentColor(FOCUSED_ALPHA));
if (resId == R.drawable.rect_focused_background_white_intercepted) {
if (resId == R.drawable.rect_white_focused_background) {
final int backColor = mAccentPalette.getAccentColor(0x55);
final int borderColor = mAccentPalette.getAccentColor(0xAA);
return new RectDrawable(mResources, backColor, 2f, borderColor);

View File

@ -0,0 +1,26 @@
package org.mariotaku.twidere.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MenuInflater;
import org.mariotaku.menucomponent.widget.MenuBar;
import org.mariotaku.twidere.menu.TwidereMenuInflater;
/**
* Created by mariotaku on 14-7-29.
*/
public class TwidereMenuBar extends MenuBar {
public TwidereMenuBar(Context context) {
super(context);
}
public TwidereMenuBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public MenuInflater getMenuInflater() {
return new TwidereMenuInflater(getContext());
}
}

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2013 NEGU Soft
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/rect_focused_background_white_intercepted"/>
</layer-list>

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2013 NEGU Soft
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/transparent" android:state_window_focused="false"/>
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:drawable="@color/ha__selector_disabled_light" android:state_enabled="false" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="@color/ha__selector_disabled_light" android:state_enabled="false" android:state_focused="true"/>
<item android:drawable="@drawable/list_selector_transition_white" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="@drawable/list_selector_transition_white" android:state_focused="false" android:state_pressed="true"/>
<item android:drawable="@drawable/focused_background_white" android:state_focused="true"/>
</selector>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
Copyright 2013 NEGU Soft
Licensed under the Apache License, Version 2.0 (the "License");
@ -16,13 +15,13 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/transparent" android:state_window_focused="false"/>
<item android:state_window_focused="false" android:drawable="@android:color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:drawable="@color/ha__selector_disabled" android:state_enabled="false" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="@color/ha__selector_disabled" android:state_enabled="false" android:state_focused="true"/>
<item android:drawable="@drawable/list_selector_transition_white" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="@drawable/list_selector_transition_white" android:state_focused="false" android:state_pressed="true"/>
<item android:drawable="@drawable/focused_background_white" android:state_focused="true"/>
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@color/ha__selector_disabled" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@color/ha__selector_disabled" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/list_selector_white_transition" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/list_selector_white_transition" />
<item android:state_focused="true" android:drawable="@drawable/rect_white_focused_background" />
</selector>
</selector>

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2013 NEGU Soft
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:drawable="@android:color/transparent" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@color/ha__selector_disabled_light" />
<item android:state_focused="true" android:state_enabled="false" android:drawable="@color/ha__selector_disabled_light" />
<item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/ha__list_selector_transition" />
<item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/ha__list_selector_transition" />
<item android:state_focused="true" android:drawable="@drawable/ha__rect_focused_background" />
</selector>

View File

@ -14,9 +14,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<transition xmlns:android="http://schemas.android.com/apk/res/android">
<transition xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:drawable="@drawable/solid_pressed_white_intercepted"/>
<item android:drawable="@drawable/solid_focused_white_intercepted"/>
<item android:drawable="@drawable/solid_white_pressed"/>
<item android:drawable="@drawable/solid_white_focused"/>
</transition>
</transition>

View File

@ -22,7 +22,7 @@
android:layout_height="wrap_content"
android:contentDescription="@string/send"
android:cropToPadding="false"
android:padding="@dimen/element_spacing_extra_small"
android:padding="@dimen/element_spacing_xsmall"
android:scaleType="centerCrop"
app:image="@drawable/ic_iconic_action_send" />

View File

@ -75,7 +75,7 @@
android:padding="2dp"
android:visibility="gone" />
<org.mariotaku.menucomponent.widget.MenuBar
<org.mariotaku.twidere.view.TwidereMenuBar
android:id="@+id/action_menu"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View File

@ -28,7 +28,7 @@
android:layout_height="match_parent"
android:layout_weight="0">
<org.mariotaku.menucomponent.widget.MenuBar
<org.mariotaku.twidere.view.TwidereMenuBar
android:id="@+id/bottom_menu"
android:layout_width="wrap_content"
android:layout_height="match_parent"

View File

@ -1,4 +1,4 @@
<org.mariotaku.menucomponent.widget.MenuBar xmlns:android="http://schemas.android.com/apk/res/android"
<org.mariotaku.twidere.view.TwidereMenuBar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_bar"
style="?android:actionBarSplitStyle"
android:layout_width="match_parent"

View File

@ -1,4 +1,4 @@
<org.mariotaku.menucomponent.widget.MenuBar xmlns:android="http://schemas.android.com/apk/res/android"
<org.mariotaku.twidere.view.TwidereMenuBar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_bar"
style="?android:actionBarSplitStyle"
android:layout_width="match_parent"

View File

@ -2,7 +2,7 @@
<org.mariotaku.twidere.view.SquareRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="@dimen/element_spacing_extra_small">
android:padding="@dimen/element_spacing_xsmall">
<org.mariotaku.twidere.view.ForegroundColorView
android:id="@+id/color"
@ -12,6 +12,6 @@
android:layout_alignParentTop="true"
android:background="?android:activatedBackgroundIndicator"
android:foreground="?android:selectableItemBackground"
android:padding="@dimen/element_spacing_extra_small"/>
android:padding="@dimen/element_spacing_xsmall"/>
</org.mariotaku.twidere.view.SquareRelativeLayout>

View File

@ -9,10 +9,10 @@
android:layout_height="match_parent"
android:layout_alignParentBottom="true"
android:layout_alignParentTop="true"
android:layout_margin="@dimen/element_spacing_extra_small"
android:layout_margin="@dimen/element_spacing_xsmall"
android:background="?android:activatedBackgroundIndicator"
android:foreground="?android:selectableItemBackground"
android:padding="@dimen/element_spacing_extra_small"/>
android:padding="@dimen/element_spacing_xsmall"/>
<!--
<org.mariotaku.twidere.view.ActivatedCheckBox
android:layout_width="wrap_content"

View File

@ -13,7 +13,7 @@
<View
android:layout_width="match_parent"
android:layout_height="@dimen/element_spacing_extra_small"
android:layout_height="@dimen/element_spacing_xsmall"
android:layout_above="@+id/profile_name_container"
android:background="@drawable/shadow_top"/>
<!--

View File

@ -1,8 +1,8 @@
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_header_title"
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:paddingLeft="5dip"
android:paddingTop="2dip"/>
android:id="@+id/list_header_title"
style="?android:attr/listSeparatorTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/element_spacing_xsmall"
android:paddingLeft="@dimen/element_spacing_small"
android:paddingTop="@dimen/element_spacing_xsmall" />

View File

@ -22,7 +22,7 @@
android:layout_alignTop="@+id/status_content"/>
</RelativeLayout>
<org.mariotaku.menucomponent.widget.MenuBar
<org.mariotaku.twidere.view.TwidereMenuBar
android:id="@+id/actionbar_split"
android:layout_width="match_parent"
android:layout_height="?android:actionBarSize"

View File

Before

Width:  |  Height:  |  Size: 172 B

After

Width:  |  Height:  |  Size: 172 B

View File

@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@ -2,7 +2,7 @@
<resources>
<dimen name="element_size_default">48dp</dimen>
<dimen name="element_spacing_extra_small">2dp</dimen>
<dimen name="element_spacing_xsmall">2dp</dimen>
<dimen name="element_spacing_small">4dp</dimen>
<dimen name="element_spacing_normal">8dp</dimen>
<dimen name="element_spacing_large">16dp</dimen>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="solid_pressed_white_intercepted" type="drawable"/>
<item name="solid_focused_white_intercepted" type="drawable"/>
<item name="rect_focused_background_white_intercepted" type="drawable"/>
<item name="solid_white_pressed" type="drawable"/>
<item name="solid_white_focused" type="drawable"/>
<item name="rect_white_focused_background" type="drawable"/>
</resources>

File diff suppressed because it is too large Load Diff