migrating to newest appcompat library

This commit is contained in:
Mariotaku Lee 2015-04-22 16:36:56 +08:00
parent 0dce3fcdd5
commit c09259f30e
55 changed files with 794 additions and 625 deletions

View File

@ -213,7 +213,7 @@ public interface IntentConstants {
public static final String EXTRA_CURRENT_MEDIA = "current_media";
public static final String EXTRA_EXTRAS = "extras";
public static final String EXTRA_MY_FOLLOWING_ONLY = "my_following_only";
public static final String EXTRA_RESTART_ACTIVITY = "restart_activity";
public static final String EXTRA_CHANGED = "changed";
public static final String EXTRA_FROM_USER = "from_user";
public static final String EXTRA_SHOW_MEDIA_PREVIEW = "show_media_preview";
public static final String EXTRA_SHOW_EXTRA_TYPE = "show_extra_type";

View File

@ -66,10 +66,10 @@ configurations.all {
dependencies {
// wearApp project(':twidere.wear')
compile 'com.android.support:multidex:1.0.1'
compile 'com.android.support:support-v13:22.0.0'
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.android.support:cardview-v7:22.0.0'
compile 'com.android.support:recyclerview-v7:22.0.0'
compile 'com.android.support:support-v13:22.1.0'
compile 'com.android.support:appcompat-v7:22.1.0'
compile 'com.android.support:cardview-v7:22.1.0'
compile 'com.android.support:recyclerview-v7:22.1.0'
compile 'com.sothree.slidinguppanel:library:3.0.0'
compile 'com.twitter:twitter-text:1.11.1'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'

View File

@ -44,7 +44,7 @@ import org.osmdroid.views.overlay.OverlayItem;
import java.util.ArrayList;
import java.util.List;
public class OpenStreetMapViewerActivity extends ThemedActionBarActivity implements Constants {
public class OpenStreetMapViewerActivity extends ThemedAppCompatActivity implements Constants {
private MapView mMapView;
private double mLatitude, mLongitude;

View File

@ -38,7 +38,7 @@ import org.mariotaku.twidere.fragment.support.WebMapFragment;
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils;
public class GoogleMapViewerActivity extends ThemedActionBarActivity implements Constants {
public class GoogleMapViewerActivity extends ThemedAppCompatActivity implements Constants {
@Override
public int getThemeColor() {

View File

@ -0,0 +1,40 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.util;
import android.view.View;
import android.widget.ListView;
/**
* Created by mariotaku on 15/4/22.
*/
public class ListViewUtils {
public static int getFirstFullyVisiblePosition(final ListView listView) {
final int firstVisiblePosition = listView.getFirstVisiblePosition();
final View firstVisibleChild = listView.getChildAt(0);
if (firstVisibleChild != null && firstVisibleChild.getTop() < 0
&& firstVisiblePosition + 1 < listView.getCount()) {
return firstVisiblePosition + 1;
}
return firstVisiblePosition;
}
}

View File

@ -217,7 +217,7 @@
<activity
android:name=".activity.SettingsActivity"
android:label="@string/settings"
android:theme="@style/Theme.Blank"
android:theme="@style/Theme.Twidere.Dark"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MANAGE_NETWORK_USAGE"/>
@ -458,10 +458,6 @@
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity
android:name=".activity.CustomTabsActivity"
android:label="@string/tabs"
android:theme="@style/Theme.Blank"/>
<activity
android:name=".activity.support.CustomTabEditorActivity"
android:exported="false"

View File

@ -0,0 +1,133 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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.
*/
package org.mariotaku.twidere.activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.Toolbar;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A {@link android.preference.PreferenceActivity} which implements and proxies the necessary calls
* to be used with AppCompat.
* <p/>
* This technique can be used with an {@link android.app.Activity} class, not just
* {@link android.preference.PreferenceActivity}.
*/
public abstract class AppCompatPreferenceActivity extends PreferenceActivity {
private AppCompatDelegate mDelegate;
public ActionBar getSupportActionBar() {
return getDelegate().getSupportActionBar();
}
public void setSupportActionBar(@Nullable Toolbar toolbar) {
getDelegate().setSupportActionBar(toolbar);
}
public boolean supportRequestWindowFeature(int featureId) {
return getDelegate().requestWindowFeature(featureId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
getDelegate().installViewFactory();
getDelegate().onCreate(savedInstanceState);
super.onCreate(savedInstanceState);
}
@Override
protected void onStop() {
super.onStop();
getDelegate().onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
getDelegate().onDestroy();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
getDelegate().onPostCreate(savedInstanceState);
}
@Override
protected void onPostResume() {
super.onPostResume();
getDelegate().onPostResume();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
getDelegate().onConfigurationChanged(newConfig);
}
@Override
public void setContentView(@LayoutRes int layoutResID) {
getDelegate().setContentView(layoutResID);
}
@Override
public void setContentView(View view) {
getDelegate().setContentView(view);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
getDelegate().setContentView(view, params);
}
@Override
public void addContentView(View view, ViewGroup.LayoutParams params) {
getDelegate().addContentView(view, params);
}
@Override
public void invalidateOptionsMenu() {
getDelegate().invalidateOptionsMenu();
}
@NonNull
@Override
public MenuInflater getMenuInflater() {
return getDelegate().getMenuInflater();
}
@Override
protected void onTitleChanged(CharSequence title, int color) {
super.onTitleChanged(title, color);
getDelegate().setTitle(title);
}
private AppCompatDelegate getDelegate() {
if (mDelegate == null) {
mDelegate = AppCompatDelegate.create(this, null);
}
return mDelegate;
}
}

View File

@ -19,71 +19,44 @@
package org.mariotaku.twidere.activity;
import android.content.Context;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.NonNull;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;
import android.view.View;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ShapedImageView;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import static org.mariotaku.twidere.util.Utils.restartActivity;
public abstract class BasePreferenceActivity extends PreferenceActivity implements Constants,
public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity implements Constants,
IThemedActivity {
private int mCurrentThemeResource;
private int mCurrentThemeResource, mCurrentThemeColor, mCurrentThemeBackgroundAlpha;
@ShapeStyle
private int mProfileImageStyle;
private String mCurrentThemeBackgroundOption;
@Override
public int getCurrentThemeBackgroundAlpha() {
return 0;
}
@Override
public int getCurrentThemeColor() {
return 0;
}
@Override
public int getCurrentThemeResourceId() {
public final int getCurrentThemeResourceId() {
return mCurrentThemeResource;
}
@Override
public int getThemeBackgroundAlpha() {
return 0;
return ThemeUtils.getUserThemeBackgroundAlpha(this);
}
@Override
public int getThemeColor() {
return 0;
}
@Override
public String getThemeFontFamily() {
return VALUE_THEME_FONT_FAMILY_REGULAR;
}
@Override
public int getThemeResourceId() {
return ThemeUtils.getSettingsThemeResource(this);
}
@Override
public final void restart() {
restartActivity(this);
}
protected final boolean isThemeChanged() {
return getThemeResourceId() != mCurrentThemeResource;
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
setTheme(mCurrentThemeResource = getThemeResourceId());
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
super.onCreate(savedInstanceState);
setActionBarBackground();
public int getCurrentThemeBackgroundAlpha() {
return mCurrentThemeBackgroundAlpha;
}
@Override
@ -91,21 +64,77 @@ public abstract class BasePreferenceActivity extends PreferenceActivity implemen
return mCurrentThemeBackgroundOption;
}
@Override
public String getThemeBackgroundOption() {
return ThemeUtils.getThemeBackgroundOption(this);
}
@Override
protected void onResume() {
super.onResume();
if (isThemeChanged()) {
restart();
}
public int getCurrentThemeColor() {
return mCurrentThemeColor;
}
private void setActionBarBackground() {
@Override
public String getThemeFontFamily() {
return ThemeUtils.getThemeFontFamily(this);
}
@Override
public final void restart() {
Utils.restartActivity(this);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
if (Utils.isDebugBuild()) {
StrictModeUtils.detectAllVmPolicy();
StrictModeUtils.detectAllThreadPolicy();
}
setTheme();
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) {
final View view = ThemeUtils.createView(name, context, attrs, mCurrentThemeColor);
if (view instanceof ShapedImageView) {
final ShapedImageView shapedImageView = (ShapedImageView) view;
shapedImageView.setStyle(mProfileImageStyle);
}
if (view != null) return view;
return super.onCreateView(name, context, attrs);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onTitleChanged(CharSequence title, int color) {
final SpannableStringBuilder builder = new SpannableStringBuilder(title);
final int themeResId = getCurrentThemeResourceId();
final int themeColor = getThemeColor();
final int contrastColor = ThemeUtils.getContrastActionBarTitleColor(this, themeResId, themeColor);
if (!ThemeUtils.isDarkTheme(themeResId)) {
builder.setSpan(new ForegroundColorSpan(contrastColor), 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
super.onTitleChanged(title, color);
}
private void setTheme() {
mCurrentThemeResource = getThemeResourceId();
mCurrentThemeColor = getThemeColor();
mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha();
mProfileImageStyle = Utils.getProfileImageStyle(this);
mCurrentThemeBackgroundOption = getThemeBackgroundOption();
setTheme(mCurrentThemeResource);
ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha);
}
}

View File

@ -28,8 +28,6 @@ import org.mariotaku.twidere.util.StrictModeUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import static org.mariotaku.twidere.util.Utils.restartActivity;
public abstract class BaseThemedActivity extends Activity implements IThemedActivity {
private int mCurrentThemeResource;
@ -76,7 +74,7 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi
@Override
public final void restart() {
restartActivity(this);
Utils.restartActivity(this);
}
protected final boolean isThemeChanged() {

View File

@ -1,81 +0,0 @@
/*
* Twidere - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.mariotaku.twidere.activity;
import android.app.ActionBar;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.MenuItem;
import org.mariotaku.twidere.fragment.CustomTabsFragment;
import org.mariotaku.twidere.model.SupportTabSpec;
import java.util.ArrayList;
import java.util.List;
import static org.mariotaku.twidere.util.CustomTabUtils.getHomeTabs;
public class CustomTabsActivity extends BasePreferenceActivity {
private final List<SupportTabSpec> mCustomTabs = new ArrayList<>();
@Override
public void onBackPressed() {
final List<SupportTabSpec> tabs = getHomeTabs(this);
setResult(isTabsChanged(tabs) && !tabs.isEmpty() ? RESULT_OK : RESULT_CANCELED);
finish();
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case MENU_HOME: {
onBackPressed();
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar ab = getActionBar();
if (ab != null) {
ab.setDisplayHomeAsUpEnabled(true);
}
final FragmentManager fm = getFragmentManager();
fm.beginTransaction().replace(android.R.id.content, new CustomTabsFragment()).commit();
initTabs();
}
private void initTabs() {
mCustomTabs.clear();
mCustomTabs.addAll(getHomeTabs(this));
}
private boolean isTabsChanged(final List<SupportTabSpec> tabs) {
if (mCustomTabs.size() != tabs.size()) return true;
for (int i = 0, size = mCustomTabs.size(); i < size; i++) {
if (!mCustomTabs.get(i).equals(tabs.get(i))) return true;
}
return false;
}
}

View File

@ -19,18 +19,18 @@
package org.mariotaku.twidere.activity;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.PorterDuff.Mode;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
@ -52,7 +52,6 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.DataExportActivity;
import org.mariotaku.twidere.activity.support.DataImportActivity;
import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.view.holder.ViewListHolder;
@ -63,37 +62,77 @@ public class SettingsActivity extends BasePreferenceActivity {
private static long HEADER_ID_RESTORE_ICON = 1001;
private SharedPreferences mPreferences;
private PackageManager mPackageManager;
private HeaderAdapter mAdapter;
private int mCurrentThemeColor, mThemeBackgroundAlpha;
private boolean mCompactCards;
private String mTheme;
private String mThemeFontFamily;
private String mThemeBackground;
private boolean mShouldNotifyChange;
public static void setShouldNotifyChange(Activity activity) {
if (!(activity instanceof SettingsActivity)) return;
((SettingsActivity) activity).setShouldNotifyChange(true);
}
private void setShouldNotifyChange(boolean notify) {
mShouldNotifyChange = notify;
public HeaderAdapter getHeaderAdapter() {
if (mAdapter != null) return mAdapter;
return mAdapter = new HeaderAdapter(this);
}
@Override
public void finish() {
if (shouldNotifyThemeChange()) {
final Intent data = new Intent();
data.putExtra(EXTRA_RESTART_ACTIVITY, true);
setResult(RESULT_OK, data);
public int getThemeColor() {
return ThemeUtils.getUserAccentColor(this);
}
@Override
public int getThemeResourceId() {
return ThemeUtils.getThemeResource(this);
}
@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);
final PackageManager pm = getPackageManager();
if (pm.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);
}
super.finish();
}
@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 onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && data != null && data.getBooleanExtra(EXTRA_CHANGED, false)) {
setShouldNotifyChange(true);
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onHeaderClick(@NonNull 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);
final PackageManager pm = getPackageManager();
pm.setComponentEnabledSetting(main, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
pm.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);
}
/**
@ -110,34 +149,16 @@ public class SettingsActivity extends BasePreferenceActivity {
}
}
public HeaderAdapter getHeaderAdapter() {
if (mAdapter != null) return mAdapter;
return mAdapter = new HeaderAdapter(this);
@Override
public void switchToHeader(final String fragmentName, final Bundle args) {
if (fragmentName == null) return;
super.switchToHeader(fragmentName, args);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && data != null && data.getBooleanExtra(EXTRA_RESTART_ACTIVITY, false)) {
setShouldNotifyChange(true);
}
super.onActivityResult(requestCode, resultCode, data);
}
@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);
}
public void switchToHeader(@NonNull final Header header) {
if (header.fragment == null && header.intent == null) return;
super.switchToHeader(header);
}
@Override
@ -147,22 +168,6 @@ public class SettingsActivity extends BasePreferenceActivity {
return true;
}
@Override
public void onHeaderClick(@NonNull 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()) {
@ -184,6 +189,16 @@ public class SettingsActivity extends BasePreferenceActivity {
return super.onOptionsItemSelected(item);
}
@Override
public void finish() {
if (shouldNotifyChange()) {
final Intent data = new Intent();
data.putExtra(EXTRA_CHANGED, true);
setResult(RESULT_OK, data);
}
super.finish();
}
@Override
public void setListAdapter(final ListAdapter adapter) {
if (adapter == null) {
@ -193,42 +208,17 @@ public class SettingsActivity extends BasePreferenceActivity {
}
}
@Override
public void switchToHeader(@NonNull final Header header) {
if (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
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);
public static void setShouldNotifyChange(Activity activity) {
if (!(activity instanceof SettingsActivity)) return;
((SettingsActivity) activity).setShouldNotifyChange(true);
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
mPackageManager = getPackageManager();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, MODE_PRIVATE);
mCompactCards = mPreferences.getBoolean(KEY_COMPACT_CARDS, false);
mTheme = mPreferences.getString(KEY_THEME, DEFAULT_THEME);
mThemeBackground = mPreferences.getString(KEY_THEME_BACKGROUND, DEFAULT_THEME_BACKGROUND);
mThemeBackgroundAlpha = mPreferences.getInt(KEY_THEME_BACKGROUND_ALPHA, DEFAULT_THEME_BACKGROUND_ALPHA);
mThemeFontFamily = mPreferences.getString(KEY_THEME_FONT_FAMILY, DEFAULT_THEME_FONT_FAMILY);
mCurrentThemeColor = ThemeUtils.getUserAccentColor(this);
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setIntent(getIntent().addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
final ActionBar actionBar = getActionBar();
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
@ -255,14 +245,12 @@ public class SettingsActivity extends BasePreferenceActivity {
}
}
private boolean shouldNotifyThemeChange() {
if (mShouldNotifyChange) return true;
return !CompareUtils.objectEquals(mTheme, mPreferences.getString(KEY_THEME, DEFAULT_THEME))
|| !CompareUtils.objectEquals(mThemeFontFamily, mPreferences.getString(KEY_THEME_FONT_FAMILY, DEFAULT_THEME_FONT_FAMILY))
|| !CompareUtils.objectEquals(mThemeBackground, mPreferences.getString(KEY_THEME_BACKGROUND, DEFAULT_THEME_BACKGROUND))
|| mCurrentThemeColor != ThemeUtils.getUserAccentColor(this)
|| mThemeBackgroundAlpha != mPreferences.getInt(KEY_THEME_BACKGROUND_ALPHA, DEFAULT_THEME_BACKGROUND_ALPHA)
|| mCompactCards != mPreferences.getBoolean(KEY_COMPACT_CARDS, false);
private void setShouldNotifyChange(boolean notify) {
mShouldNotifyChange = notify;
}
private boolean shouldNotifyChange() {
return mShouldNotifyChange;
}
private static class HeaderAdapter extends BaseAdapter {
@ -295,49 +283,11 @@ public class SettingsActivity extends BasePreferenceActivity {
notifyDataSetChanged();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public void notifyDataSetChanged() {
updateCategoriesInfo();
super.notifyDataSetChanged();
}
private void updateCategoriesInfo() {
mFirstItemIsCategory = !mHeaders.isEmpty()
&& getHeaderType(mHeaders.get(0)) == HEADER_TYPE_CATEGORY;
mCategoriesCount = getCategoriesCount(0, mHeaders.size());
}
private int getCategoriesCount(final int start, final int end) {
int categoriesCount = 0;
for (int i = start; i < end; i++) {
if (getHeaderType(mHeaders.get(i)) == HEADER_TYPE_CATEGORY) {
categoriesCount++;
}
}
return categoriesCount;
}
public void clear() {
mHeaders.clear();
notifyDataSetChanged();
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(final int position) {
final Header header = getItem(position);
return getHeaderType(header);
}
@Override
public int getCount() {
return mHeaders.size() + mCategoriesCount + (mFirstItemIsCategory ? 0 : 1);
@ -386,6 +336,33 @@ public class SettingsActivity extends BasePreferenceActivity {
return view;
}
@Override
public void notifyDataSetChanged() {
updateCategoriesInfo();
super.notifyDataSetChanged();
}
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(final int position) {
return getItemViewType(position) == HEADER_TYPE_NORMAL;
}
@Override
public int getItemViewType(final int position) {
final Header header = getItem(position);
return getHeaderType(header);
}
@Override
public int getViewTypeCount() {
return 3;
}
private void bindCategoryHeader(View view, int position, Header header) {
final TextView title = (TextView) view.findViewById(android.R.id.title);
if (!TextUtils.isEmpty(header.title)) {
@ -428,6 +405,26 @@ public class SettingsActivity extends BasePreferenceActivity {
}
}
private int getCategoriesCount(final int start, final int end) {
int categoriesCount = 0;
for (int i = start; i < end; i++) {
if (getHeaderType(mHeaders.get(i)) == HEADER_TYPE_CATEGORY) {
categoriesCount++;
}
}
return categoriesCount;
}
private static int getHeaderType(final Header header) {
if (header.fragment != null || header.intent != null)
return HEADER_TYPE_NORMAL;
else if (header.title != null || header.titleRes != 0)
return HEADER_TYPE_CATEGORY;
else
return HEADER_TYPE_SPACE;
}
private View inflateItemView(int viewType, ViewGroup parent) {
final int layoutRes;
switch (viewType) {
@ -447,19 +444,10 @@ public class SettingsActivity extends BasePreferenceActivity {
return mInflater.inflate(layoutRes, parent, false);
}
@Override
public boolean isEnabled(final int position) {
return getItemViewType(position) == HEADER_TYPE_NORMAL;
}
private static int getHeaderType(final Header header) {
if (header.fragment != null || header.intent != null)
return HEADER_TYPE_NORMAL;
else if (header.title != null || header.titleRes != 0)
return HEADER_TYPE_CATEGORY;
else
return HEADER_TYPE_SPACE;
private void updateCategoriesInfo() {
mFirstItemIsCategory = !mHeaders.isEmpty()
&& getHeaderType(mHeaders.get(0)) == HEADER_TYPE_CATEGORY;
mCategoriesCount = getCategoriesCount(0, mHeaders.size());
}
private static class HeaderViewHolder extends ViewListHolder {

View File

@ -34,6 +34,7 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceScreen;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
@ -49,6 +50,7 @@ import org.mariotaku.twidere.adapter.TabsAdapter;
import org.mariotaku.twidere.fragment.BaseDialogFragment;
import org.mariotaku.twidere.fragment.BaseFragment;
import org.mariotaku.twidere.fragment.BasePreferenceFragment;
import org.mariotaku.twidere.fragment.CustomTabsFragment;
import org.mariotaku.twidere.fragment.ProgressDialogFragment;
import org.mariotaku.twidere.fragment.support.DirectMessagesFragment;
import org.mariotaku.twidere.fragment.support.HomeTimelineFragment;
@ -370,7 +372,10 @@ public class SettingsWizardActivity extends Activity implements Constants {
public boolean onPreferenceClick(final Preference preference) {
final String key = preference.getKey();
if (WIZARD_PREFERENCE_KEY_EDIT_CUSTOM_TABS.equals(key)) {
startActivityForResult(new Intent(getActivity(), CustomTabsActivity.class), REQUEST_CUSTOM_TABS);
final Intent intent = new Intent(getActivity(), SettingsActivity.class);
intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, CustomTabsFragment.class.getName());
intent.putExtra(PreferenceActivity.EXTRA_SHOW_FRAGMENT_TITLE, R.string.tabs);
startActivityForResult(intent, REQUEST_CUSTOM_TABS);
} else if (WIZARD_PREFERENCE_KEY_USE_DEFAULTS.equals(key)) {
applyInitialTabSettings();
}

View File

@ -39,7 +39,7 @@ import org.mariotaku.twidere.view.iface.IExtendedView.OnFitSystemWindowsListener
import java.util.ArrayList;
@SuppressLint("Registered")
public class BaseActionBarActivity extends ThemedActionBarActivity implements Constants,
public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Constants,
OnFitSystemWindowsListener, SystemWindowsInsetsCallback, IControlBarActivity,
KeyboardShortcutCallback {

View File

@ -37,7 +37,7 @@ import org.mariotaku.twidere.view.TintedStatusFrameLayout;
/**
* Created by mariotaku on 15/4/17.
*/
public class BaseDialogWhenLargeActivity extends BaseActionBarActivity {
public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity {
private TintedStatusFrameLayout mMainContent;

View File

@ -32,7 +32,7 @@ import android.widget.Toast;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.fragment.BaseWebViewFragment;
public class BrowserActivity extends BaseActionBarActivity {
public class BrowserActivity extends BaseAppCompatActivity {
private Uri mUri = Uri.parse("about:blank");

View File

@ -19,7 +19,7 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DataExportActivity extends BaseActionBarActivity implements FileSelectorDialogFragment.Callback,
public class DataExportActivity extends BaseAppCompatActivity implements FileSelectorDialogFragment.Callback,
DataExportImportTypeSelectorDialogFragment.Callback {
private ExportSettingsTask mTask;

View File

@ -17,7 +17,7 @@ import org.mariotaku.twidere.util.ThemeUtils;
import java.io.File;
import java.io.IOException;
public class DataImportActivity extends BaseActionBarActivity implements FileSelectorDialogFragment.Callback,
public class DataImportActivity extends BaseAppCompatActivity implements FileSelectorDialogFragment.Callback,
DataExportImportTypeSelectorDialogFragment.Callback {
private ImportSettingsTask mImportSettingsTask;

View File

@ -86,7 +86,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Mentions;
import org.mariotaku.twidere.provider.TwidereDataStore.Statuses;
import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ColorUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.CustomTabUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
@ -129,7 +129,7 @@ import static org.mariotaku.twidere.util.Utils.openMessageConversation;
import static org.mariotaku.twidere.util.Utils.openSearch;
import static org.mariotaku.twidere.util.Utils.showMenuItemToast;
public class HomeActivity extends BaseActionBarActivity implements OnClickListener, OnPageChangeListener,
public class HomeActivity extends BaseAppCompatActivity implements OnClickListener, OnPageChangeListener,
SupportFragmentCallback, OnOpenedListener, OnClosedListener, OnLongClickListener {
private final Handler mHandler = new Handler();
@ -818,7 +818,7 @@ public class HomeActivity extends BaseActionBarActivity implements OnClickListen
mColorStatusFrameLayout.setColor(getResources().getColor(R.color.background_color_action_bar_dark), actionBarAlpha);
mColorStatusFrameLayout.setFactor(1);
} else {
final int contrastColor = ColorUtils.getContrastYIQ(themeColor, 192);
final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor, 192);
homeActionButton.setButtonColor(themeColor);
homeActionButton.setIconColor(contrastColor, Mode.SRC_ATOP);
mTabIndicator.setStripColor(contrastColor);

View File

@ -36,7 +36,7 @@ import java.io.OutputStream;
import static android.os.Environment.getExternalStorageState;
public class ImagePickerActivity extends ThemedActionBarActivity {
public class ImagePickerActivity extends ThemedAppCompatActivity {
public static final int REQUEST_PICK_IMAGE = 101;
public static final int REQUEST_TAKE_PHOTO = 102;

View File

@ -62,7 +62,7 @@ import org.mariotaku.twidere.view.TintedStatusFrameLayout;
import static org.mariotaku.twidere.util.Utils.createFragmentForIntent;
import static org.mariotaku.twidere.util.Utils.matchLinkId;
public class LinkHandlerActivity extends BaseActionBarActivity implements SystemWindowsInsetsCallback,
public class LinkHandlerActivity extends BaseAppCompatActivity implements SystemWindowsInsetsCallback,
IControlBarActivity, SupportFragmentCallback {
private ControlBarShowHideHelper mControlBarShowHideHelper = new ControlBarShowHideHelper(this);

View File

@ -86,7 +86,7 @@ import pl.droidsonroids.gif.GifTextureView;
import pl.droidsonroids.gif.InputSource.FileSource;
public final class MediaViewerActivity extends ThemedActionBarActivity implements Constants, OnPageChangeListener {
public final class MediaViewerActivity extends ThemedAppCompatActivity implements Constants, OnPageChangeListener {
private static final String EXTRA_LOOP = "loop";

View File

@ -38,6 +38,7 @@ import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.WindowCompat;
import android.support.v7.app.ActionBar;
import android.text.Editable;
@ -68,7 +69,6 @@ import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.WrongUserPassExcept
import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.util.net.OkHttpClientFactory;
import org.mariotaku.twidere.util.net.TwidereHostResolverFactory;
@ -92,7 +92,7 @@ import static org.mariotaku.twidere.util.Utils.isUserLoggedIn;
import static org.mariotaku.twidere.util.Utils.showErrorMessage;
import static org.mariotaku.twidere.util.Utils.trim;
public class SignInActivity extends BaseActionBarActivity implements TwitterConstants, OnClickListener,
public class SignInActivity extends BaseAppCompatActivity implements TwitterConstants, OnClickListener,
TextWatcher {
private static final String TWITTER_SIGNUP_URL = "https://twitter.com/signup";
@ -148,7 +148,7 @@ public class SignInActivity extends BaseActionBarActivity implements TwitterCons
break;
}
case REQUEST_BROWSER_SIGN_IN: {
if (resultCode == BaseActionBarActivity.RESULT_OK && data != null) {
if (resultCode == BaseAppCompatActivity.RESULT_OK && data != null) {
doLogin(data);
}
break;
@ -329,7 +329,7 @@ public class SignInActivity extends BaseActionBarActivity implements TwitterCons
mEditPassword.addTextChangedListener(this);
final Resources resources = getResources();
final ColorStateList color = ColorStateList.valueOf(resources.getColor(R.color.material_light_green));
ViewUtils.setBackgroundTintList(mSignInButton, color);
ViewCompat.setBackgroundTintList(mSignInButton, color);
setSignInButton();
}

View File

@ -22,7 +22,7 @@ package org.mariotaku.twidere.activity.support;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.AppCompatActivity;
import android.util.AttributeSet;
import android.view.View;
@ -34,9 +34,7 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ShapedImageView;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import static org.mariotaku.twidere.util.Utils.restartActivity;
public abstract class ThemedActionBarActivity extends ActionBarActivity implements Constants, IThemedActivity {
public abstract class ThemedAppCompatActivity extends AppCompatActivity implements Constants, IThemedActivity {
private int mCurrentThemeResource, mCurrentThemeColor, mCurrentThemeBackgroundAlpha;
@ShapeStyle
@ -80,7 +78,7 @@ public abstract class ThemedActionBarActivity extends ActionBarActivity implemen
@Override
public final void restart() {
restartActivity(this);
Utils.restartActivity(this);
}
@Override

View File

@ -37,8 +37,6 @@ import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.ShapedImageView;
import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle;
import static org.mariotaku.twidere.util.Utils.restartActivity;
public abstract class ThemedFragmentActivity extends FragmentActivity implements Constants, IThemedActivity {
private int mCurrentThemeResource, mCurrentThemeColor, mCurrentThemeBackgroundAlpha;
@ -83,7 +81,7 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements
@Override
public final void restart() {
restartActivity(this);
Utils.restartActivity(this);
}
@Override

View File

@ -27,7 +27,7 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.BaseActionBarActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.MultiSelectManager;
@ -76,7 +76,7 @@ public class BaseFragment extends Fragment implements Constants {
public void setProgressBarIndeterminateVisibility(final boolean visible) {
final Activity activity = getActivity();
if (activity instanceof BaseActionBarActivity) {
if (activity instanceof BaseAppCompatActivity) {
activity.setProgressBarIndeterminateVisibility(visible);
}
}

View File

@ -39,11 +39,11 @@ import android.view.ViewGroup;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener;
import org.mariotaku.twidere.activity.support.BaseActionBarActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.adapter.decorator.DividerItemDecoration;
import org.mariotaku.twidere.adapter.iface.IContentCardAdapter;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.util.ColorUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.ContentListScrollListener;
import org.mariotaku.twidere.util.ContentListScrollListener.ContentListSupport;
import org.mariotaku.twidere.util.SimpleDrawerCallback;
@ -115,8 +115,8 @@ public abstract class AbsContentListFragment<A extends IContentCardAdapter> exte
@Override
public void setControlVisible(boolean visible) {
final FragmentActivity activity = getActivity();
if (activity instanceof BaseActionBarActivity) {
((BaseActionBarActivity) activity).setControlBarVisibleAnimate(visible);
if (activity instanceof BaseAppCompatActivity) {
((BaseAppCompatActivity) activity).setControlBarVisibleAnimate(visible);
}
}
@ -185,7 +185,7 @@ public abstract class AbsContentListFragment<A extends IContentCardAdapter> exte
final Context context = view.getContext();
final boolean compact = Utils.isCompactCards(context);
final int backgroundColor = ThemeUtils.getThemeBackgroundColor(context);
final int colorRes = ColorUtils.getContrastYIQ(backgroundColor,
final int colorRes = TwidereColorUtils.getContrastYIQ(backgroundColor,
R.color.bg_refresh_progress_color_light, R.color.bg_refresh_progress_color_dark);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeColors(ThemeUtils.getUserAccentColor(context));

View File

@ -31,6 +31,7 @@ import org.mariotaku.twidere.loader.iface.IExtendedLoader;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.model.ParcelableStatus;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ContentListScrollListener;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.ReadStateManager;
@ -346,12 +347,16 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListFragment<A
mReadStateManager = getReadStateManager();
final FragmentActivity activity = getActivity();
final TwidereApplication application = TwidereApplication.getInstance(activity);
mKeyboardShortcutsHandler = application.getKeyboardShortcutsHandler();
final AbsStatusesAdapter<Data> adapter = getAdapter();
final RecyclerView recyclerView = getRecyclerView();
final LinearLayoutManager layoutManager = getLayoutManager();
final ContentListScrollListener scrollListener = getScrollListener();
mKeyboardShortcutsHandler = application.getKeyboardShortcutsHandler();
mRecyclerViewNavigationHelper = new RecyclerViewNavigationHelper(mKeyboardShortcutsHandler,
recyclerView, layoutManager, adapter);
adapter.setListener(this);
getScrollListener().setOnScrollListener(new OnScrollListener() {
scrollListener.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
@ -359,7 +364,6 @@ public abstract class AbsStatusesFragment<Data> extends AbsContentListFragment<A
}
}
});
mRecyclerViewNavigationHelper = new RecyclerViewNavigationHelper(mKeyboardShortcutsHandler, recyclerView, layoutManager, adapter);
final Bundle loaderArgs = new Bundle(getArguments());
loaderArgs.putBoolean(EXTRA_FROM_USER, true);

View File

@ -97,6 +97,7 @@ import org.mariotaku.twidere.provider.TwidereDataStore.Accounts;
import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.ListViewUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TransitionUtils;
@ -178,7 +179,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
}
}
final ListView listView = getListView();
int firstVisiblePosition = listView.getFirstVisiblePosition();
final int firstVisiblePosition = ListViewUtils.getFirstFullyVisiblePosition(listView);
final int selectedItem = listView.getSelectedItemPosition();
final int count = listView.getCount();
int resultPosition;
@ -206,7 +207,7 @@ public class AccountsDashboardFragment extends BaseSupportListFragment implement
case REQUEST_SETTINGS: {
if (data == null) return;
final FragmentActivity activity = getActivity();
if (data.getBooleanExtra(EXTRA_RESTART_ACTIVITY, false) && activity instanceof IThemedActivity) {
if (data.getBooleanExtra(EXTRA_CHANGED, false) && activity instanceof IThemedActivity) {
((IThemedActivity) activity).restart();
}
return;

View File

@ -32,7 +32,7 @@ import android.support.v4.app.FragmentActivity;
import android.view.View;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.support.BaseActionBarActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.iface.IBaseFragment;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
@ -102,7 +102,7 @@ public class BaseSupportFragment extends Fragment implements IBaseFragment, Cons
public void setProgressBarIndeterminateVisibility(final boolean visible) {
final Activity activity = getActivity();
if (activity instanceof BaseActionBarActivity) {
if (activity instanceof BaseAppCompatActivity) {
activity.setProgressBarIndeterminateVisibility(visible);
}
}

View File

@ -57,7 +57,7 @@ import org.mariotaku.querybuilder.RawItemArray;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.iface.IControlBarActivity;
import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffsetListener;
import org.mariotaku.twidere.activity.support.BaseActionBarActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter.DirectMessageEntry;
import org.mariotaku.twidere.adapter.MessageEntriesAdapter.MessageEntriesAdapterListener;
@ -134,8 +134,8 @@ public class DirectMessagesFragment extends BaseSupportFragment implements Loade
@Override
public void setControlVisible(boolean visible) {
final FragmentActivity activity = getActivity();
if (activity instanceof BaseActionBarActivity) {
((BaseActionBarActivity) activity).setControlBarVisibleAnimate(visible);
if (activity instanceof BaseAppCompatActivity) {
((BaseAppCompatActivity) activity).setControlBarVisibleAnimate(visible);
}
}

View File

@ -70,7 +70,7 @@ import org.mariotaku.querybuilder.Expression;
import org.mariotaku.querybuilder.OrderBy;
import org.mariotaku.querybuilder.RawItemArray;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseActionBarActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.activity.support.ImagePickerActivity;
import org.mariotaku.twidere.adapter.AccountsSpinnerAdapter;
import org.mariotaku.twidere.adapter.MessageConversationAdapter;
@ -195,7 +195,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final BaseActionBarActivity activity = (BaseActionBarActivity) getActivity();
final BaseAppCompatActivity activity = (BaseAppCompatActivity) getActivity();
mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE);
mMessageDrafts = getSharedPreferences(MESSAGE_DRAFTS_PREFERENCES_NAME, Context.MODE_PRIVATE);
mImageLoader = TwidereApplication.getInstance(activity).getMediaLoaderWrapper();
@ -681,7 +681,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements
}
private void updateActionBar() {
final BaseActionBarActivity activity = (BaseActionBarActivity) getActivity();
final BaseAppCompatActivity activity = (BaseAppCompatActivity) getActivity();
final ActionBar actionBar = activity.getSupportActionBar();
if (actionBar == null) return;
actionBar.setDisplayOptions(mRecipient != null ? ActionBar.DISPLAY_SHOW_TITLE : ActionBar.DISPLAY_SHOW_CUSTOM,

View File

@ -92,6 +92,7 @@ public class RetweetQuoteDialogFragment extends BaseSupportDialogFragment implem
view.findViewById(R.id.item_menu).setVisibility(View.GONE);
view.findViewById(R.id.action_buttons).setVisibility(View.GONE);
view.findViewById(R.id.item_content).setFocusable(false);
return builder.create();
}

View File

@ -27,10 +27,12 @@ import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle;
import android.provider.SearchRecentSuggestions;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@ -44,6 +46,7 @@ import org.mariotaku.twidere.activity.iface.IControlBarActivity.ControlBarOffset
import org.mariotaku.twidere.activity.support.ComposeActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback;
import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface;
import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback;
@ -51,13 +54,15 @@ import org.mariotaku.twidere.graphic.EmptyDrawable;
import org.mariotaku.twidere.provider.RecentSearchProvider;
import org.mariotaku.twidere.provider.TwidereDataStore.SearchHistory;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.view.TabPagerIndicator;
public class SearchFragment extends BaseSupportFragment implements RefreshScrollTopInterface,
SupportFragmentCallback, SystemWindowsInsetsCallback, ControlBarOffsetListener,
OnPageChangeListener {
OnPageChangeListener, KeyboardShortcutCallback {
private ViewPager mViewPager;
private View mPagerWindowOverlay;
@ -65,9 +70,75 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
private SupportTabsAdapter mPagerAdapter;
private TabPagerIndicator mPagerIndicator;
private KeyboardShortcutsHandler mKeyboardShortcutsHandler;
private int mControlBarOffsetPixels;
private int mControlBarHeight;
public long getAccountId() {
return getArguments().getLong(EXTRA_ACCOUNT_ID);
}
@Override
public Fragment getCurrentVisibleFragment() {
final int currentItem = mViewPager.getCurrentItem();
if (currentItem < 0 || currentItem >= mPagerAdapter.getCount()) return null;
return (Fragment) mPagerAdapter.instantiateItem(mViewPager, currentItem);
}
@Override
public boolean triggerRefresh(final int position) {
return false;
}
public String getQuery() {
return getArguments().getString(EXTRA_QUERY);
}
@Override
public boolean getSystemWindowsInsets(Rect insets) {
if (mPagerIndicator == null) return false;
final FragmentActivity activity = getActivity();
if (activity instanceof LinkHandlerActivity) {
((LinkHandlerActivity) activity).getSystemWindowsInsets(insets);
insets.top = mPagerIndicator.getHeight() + getControlBarHeight();
return true;
}
return false;
}
@Override
public boolean handleKeyboardShortcutSingle(int keyCode, @NonNull KeyEvent event) {
if (handleFragmentKeyboardShortcutSingle(keyCode, event)) return true;
final String action = mKeyboardShortcutsHandler.getKeyAction("navigation", keyCode, event);
if (action != null) {
switch (action) {
case "navigation.previous_tab": {
final int previous = mViewPager.getCurrentItem() - 1;
if (previous >= 0 && previous < mPagerAdapter.getCount()) {
mViewPager.setCurrentItem(previous, true);
}
return true;
}
case "navigation.next_tab": {
final int next = mViewPager.getCurrentItem() + 1;
if (next >= 0 && next < mPagerAdapter.getCount()) {
mViewPager.setCurrentItem(next, true);
}
return true;
}
}
}
return mKeyboardShortcutsHandler.handleKey(getActivity(), null, keyCode, event);
}
@Override
public boolean handleKeyboardShortcutRepeat(int keyCode, int repeatCount, @NonNull KeyEvent event) {
return handleFragmentKeyboardShortcutRepeat(keyCode, repeatCount, event);
}
public void hideIndicator() {
}
@Override
public void onAttach(Activity activity) {
@ -78,86 +149,8 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
}
@Override
public void onDetach() {
final FragmentActivity activity = getActivity();
if (activity instanceof IControlBarActivity) {
((IControlBarActivity) activity).unregisterControlBarOffsetListener(this);
}
super.onDetach();
}
@Override
public void onControlBarOffsetChanged(IControlBarActivity activity, float offset) {
mControlBarHeight = activity.getControlBarHeight();
mControlBarOffsetPixels = Math.round(mControlBarHeight * (1 - offset));
updateTabOffset();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
final FragmentActivity activity = getActivity();
if (activity instanceof LinkHandlerActivity) {
((LinkHandlerActivity) activity).setControlBarVisibleAnimate(true);
}
}
private void updateTabOffset() {
final int controlBarHeight = getControlBarHeight();
final int translationY = controlBarHeight - mControlBarOffsetPixels;
final FragmentActivity activity = getActivity();
if (activity instanceof LinkHandlerActivity) {
final View view = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (view != null && controlBarHeight != 0) {
view.setAlpha(translationY / (float) controlBarHeight);
}
}
mPagerIndicator.setTranslationY(translationY);
mPagerWindowOverlay.setTranslationY(translationY);
}
private int getControlBarHeight() {
final FragmentActivity activity = getActivity();
final int controlBarHeight;
if (activity instanceof LinkHandlerActivity) {
controlBarHeight = ((LinkHandlerActivity) activity).getControlBarHeight();
} else {
controlBarHeight = mControlBarHeight;
}
if (controlBarHeight == 0) {
return Utils.getActionBarHeight(activity);
}
return controlBarHeight;
}
@Override
protected void fitSystemWindows(Rect insets) {
super.fitSystemWindows(insets);
final View view = getView();
if (view != null) {
final int top = Utils.getInsetsTopWithoutActionBarHeight(getActivity(), insets.top);
view.setPadding(insets.left, top, insets.right, insets.bottom);
}
updateTabOffset();
}
@Override
public Fragment getCurrentVisibleFragment() {
final int currentItem = mViewPager.getCurrentItem();
if (currentItem < 0 || currentItem >= mPagerAdapter.getCount()) return null;
return (Fragment) mPagerAdapter.instantiateItem(mViewPager, currentItem);
}
public void hideIndicator() {
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_content_pages, container, false);
}
@Override
@ -166,6 +159,8 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
setHasOptionsMenu(true);
final Bundle args = getArguments();
final FragmentActivity activity = getActivity();
final TwidereApplication app = TwidereApplication.getInstance(activity);
mKeyboardShortcutsHandler = app.getKeyboardShortcutsHandler();
mPagerAdapter = new SupportTabsAdapter(activity, getChildFragmentManager(), null, 1);
mPagerAdapter.addTab(StatusesSearchFragment.class, args, getString(R.string.statuses), R.drawable.ic_action_twitter, 0, null);
mPagerAdapter.addTab(SearchUsersFragment.class, args, getString(R.string.users), R.drawable.ic_action_user, 1, null);
@ -195,12 +190,13 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
updateTabOffset();
}
public String getQuery() {
return getArguments().getString(EXTRA_QUERY);
}
public long getAccountId() {
return getArguments().getLong(EXTRA_ACCOUNT_ID);
@Override
public void onDetach() {
final FragmentActivity activity = getActivity();
if (activity instanceof IControlBarActivity) {
((IControlBarActivity) activity).unregisterControlBarOffsetListener(this);
}
super.onDetach();
}
@Override
@ -209,8 +205,9 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_content_pages, container, false);
public void onPrepareOptionsMenu(Menu menu) {
final MenuItem item = menu.findItem(MENU_COMPOSE);
item.setTitle(getString(R.string.tweet_hashtag, getQuery()));
}
@Override
@ -236,12 +233,6 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
return super.onOptionsItemSelected(item);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
final MenuItem item = menu.findItem(MENU_COMPOSE);
item.setTitle(getString(R.string.tweet_hashtag, getQuery()));
}
@Override
public void onBaseViewCreated(final View view, final Bundle savedInstanceState) {
super.onBaseViewCreated(view, savedInstanceState);
@ -250,6 +241,42 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
mPagerIndicator = (TabPagerIndicator) view.findViewById(R.id.view_pager_tabs);
}
@Override
protected void fitSystemWindows(Rect insets) {
super.fitSystemWindows(insets);
final View view = getView();
if (view != null) {
final int top = Utils.getInsetsTopWithoutActionBarHeight(getActivity(), insets.top);
view.setPadding(insets.left, top, insets.right, insets.bottom);
}
updateTabOffset();
}
@Override
public void onControlBarOffsetChanged(IControlBarActivity activity, float offset) {
mControlBarHeight = activity.getControlBarHeight();
mControlBarOffsetPixels = Math.round(mControlBarHeight * (1 - offset));
updateTabOffset();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
final FragmentActivity activity = getActivity();
if (activity instanceof LinkHandlerActivity) {
((LinkHandlerActivity) activity).setControlBarVisibleAnimate(true);
}
}
@Override
public boolean scrollToStart() {
final Fragment fragment = getCurrentVisibleFragment();
@ -266,20 +293,51 @@ public class SearchFragment extends BaseSupportFragment implements RefreshScroll
return true;
}
@Override
public boolean triggerRefresh(final int position) {
return false;
private int getControlBarHeight() {
final FragmentActivity activity = getActivity();
final int controlBarHeight;
if (activity instanceof LinkHandlerActivity) {
controlBarHeight = ((LinkHandlerActivity) activity).getControlBarHeight();
} else {
controlBarHeight = mControlBarHeight;
}
if (controlBarHeight == 0) {
return Utils.getActionBarHeight(activity);
}
return controlBarHeight;
}
@Override
public boolean getSystemWindowsInsets(Rect insets) {
if (mPagerIndicator == null) return false;
final FragmentActivity activity = getActivity();
if (activity instanceof LinkHandlerActivity) {
((LinkHandlerActivity) activity).getSystemWindowsInsets(insets);
insets.top = mPagerIndicator.getHeight() + getControlBarHeight();
return true;
private Fragment getKeyboardShortcutRecipient() {
return getCurrentVisibleFragment();
}
private boolean handleFragmentKeyboardShortcutRepeat(int keyCode, int repeatCount, @NonNull KeyEvent event) {
final Fragment fragment = getKeyboardShortcutRecipient();
if (fragment instanceof KeyboardShortcutCallback) {
return ((KeyboardShortcutCallback) fragment).handleKeyboardShortcutRepeat(keyCode, repeatCount, event);
}
return false;
}
private boolean handleFragmentKeyboardShortcutSingle(int keyCode, @NonNull KeyEvent event) {
final Fragment fragment = getKeyboardShortcutRecipient();
if (fragment instanceof KeyboardShortcutCallback) {
return ((KeyboardShortcutCallback) fragment).handleKeyboardShortcutSingle(keyCode, event);
}
return false;
}
private void updateTabOffset() {
final int controlBarHeight = getControlBarHeight();
final int translationY = controlBarHeight - mControlBarOffsetPixels;
final FragmentActivity activity = getActivity();
if (activity instanceof LinkHandlerActivity) {
final View view = activity.getWindow().findViewById(android.support.v7.appcompat.R.id.action_bar);
if (view != null && controlBarHeight != 0) {
view.setAlpha(translationY / (float) controlBarHeight);
}
}
mPagerIndicator.setTranslationY(translationY);
mPagerWindowOverlay.setTranslationY(translationY);
}
}

View File

@ -63,6 +63,7 @@ import android.text.style.URLSpan;
import android.view.ActionMode;
import android.view.ActionMode.Callback;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@ -96,10 +97,14 @@ import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ClipboardUtils;
import org.mariotaku.twidere.util.CompareUtils;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
import org.mariotaku.twidere.util.LinkCreator;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.MediaLoadingHandler;
import org.mariotaku.twidere.util.MenuUtils;
import org.mariotaku.twidere.util.RecyclerViewNavigationHelper;
import org.mariotaku.twidere.util.RecyclerViewUtils;
import org.mariotaku.twidere.util.SharedPreferencesWrapper;
import org.mariotaku.twidere.util.StatusAdapterLinkClickHandler;
import org.mariotaku.twidere.util.StatusLinkClickHandler;
@ -144,22 +149,28 @@ import static org.mariotaku.twidere.util.Utils.showErrorMessage;
* Created by mariotaku on 14/12/5.
*/
public class StatusFragment extends BaseSupportFragment implements LoaderCallbacks<SingleResponse<ParcelableStatus>>,
OnMediaClickListener, StatusAdapterListener {
OnMediaClickListener, StatusAdapterListener, KeyboardShortcutCallback {
private static final int LOADER_ID_DETAIL_STATUS = 1;
private static final int LOADER_ID_STATUS_REPLIES = 2;
private static final int STATE_LOADED = 1;
private static final int STATE_LOADING = 2;
private static final int STATE_ERROR = 3;
private RecyclerView mRecyclerView;
private StatusAdapter mStatusAdapter;
private boolean mRepliesLoaderInitialized;
private LoadConversationTask mLoadConversationTask;
private LinearLayoutManager mLayoutManager;
private View mStatusContent;
private View mProgressContainer;
private View mErrorContainer;
private DividerItemDecoration mItemDecoration;
private RecyclerView mRecyclerView;
private StatusAdapter mStatusAdapter;
private LinearLayoutManager mLayoutManager;
private LoadConversationTask mLoadConversationTask;
private KeyboardShortcutsHandler mKeyboardShortcutsHandler;
private RecyclerViewNavigationHelper mRecyclerViewNavigationHelper;
private boolean mRepliesLoaderInitialized;
private LoaderCallbacks<List<ParcelableStatus>> mRepliesLoaderCallback = new LoaderCallbacks<List<ParcelableStatus>>() {
@Override
@ -264,6 +275,12 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
mStatusAdapter.setEventListener(this);
mRecyclerView.setAdapter(mStatusAdapter);
final FragmentActivity activity = getActivity();
final TwidereApplication application = TwidereApplication.getInstance(activity);
mKeyboardShortcutsHandler = application.getKeyboardShortcutsHandler();
mRecyclerViewNavigationHelper = new RecyclerViewNavigationHelper(mKeyboardShortcutsHandler,
mRecyclerView, mLayoutManager, mStatusAdapter);
setState(STATE_LOADING);
getLoaderManager().initLoader(LOADER_ID_DETAIL_STATUS, getArguments(), this);
@ -394,6 +411,52 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
//end
}
@Override
public boolean handleKeyboardShortcutSingle(int keyCode, @NonNull KeyEvent event) {
if (!KeyboardShortcutsHandler.isValidForHotkey(keyCode, event)) return false;
final View focusedChild = RecyclerViewUtils.findRecyclerViewChild(mRecyclerView, mLayoutManager.getFocusedChild());
final int position;
if (focusedChild != null && focusedChild.getParent() == mRecyclerView) {
position = mRecyclerView.getChildLayoutPosition(focusedChild);
} else {
return false;
}
if (position == -1) return false;
final ParcelableStatus status = getAdapter().getStatus(position);
if (status == null) return false;
String action = mKeyboardShortcutsHandler.getKeyAction("status", keyCode, event);
if (action == null) return false;
switch (action) {
case "status.reply": {
final Intent intent = new Intent(INTENT_ACTION_REPLY);
intent.putExtra(EXTRA_STATUS, status);
startActivity(intent);
return true;
}
case "status.retweet": {
RetweetQuoteDialogFragment.show(getFragmentManager(), status);
return true;
}
case "status.favorite": {
final AsyncTwitterWrapper twitter = getTwitterWrapper();
if (status.is_favorite) {
twitter.destroyFavoriteAsync(status.account_id, status.id);
} else {
twitter.createFavoriteAsync(status.account_id, status.id);
}
return true;
}
}
return false;
}
@Override
public boolean handleKeyboardShortcutRepeat(final int keyCode, final int repeatCount,
@NonNull final KeyEvent event) {
return mRecyclerViewNavigationHelper.handleKeyboardShortcutRepeat(keyCode, repeatCount, event);
}
private void addConversation(ParcelableStatus status, int position) {
mStatusAdapter.addConversation(status, position);
}
@ -720,7 +783,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
textView.setText(Html.fromHtml(status.text_html));
linkify.applyAllLinks(textView, status.account_id, getAdapterPosition(), status.is_possibly_sensitive);
linkify.applyAllLinks(textView, status.account_id, getLayoutPosition(), status.is_possibly_sensitive);
ThemeUtils.applyParagraphSpacing(textView, 1.1f);
if (!TextUtils.isEmpty(status.place_full_name)) {
@ -794,7 +857,7 @@ public class StatusFragment extends BaseSupportFragment implements LoaderCallbac
@Override
public void onClick(View v) {
final ParcelableStatus status = adapter.getStatus(getAdapterPosition());
final ParcelableStatus status = adapter.getStatus(getLayoutPosition());
final StatusFragment fragment = adapter.getFragment();
switch (v.getId()) {
case R.id.media_preview_load: {

View File

@ -89,7 +89,7 @@ import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.activity.support.AccountSelectorActivity;
import org.mariotaku.twidere.activity.support.ColorPickerDialogActivity;
import org.mariotaku.twidere.activity.support.LinkHandlerActivity;
import org.mariotaku.twidere.activity.support.ThemedActionBarActivity;
import org.mariotaku.twidere.activity.support.ThemedAppCompatActivity;
import org.mariotaku.twidere.activity.support.UserListSelectorActivity;
import org.mariotaku.twidere.activity.support.UserProfileEditorActivity;
import org.mariotaku.twidere.adapter.support.SupportTabsAdapter;
@ -109,7 +109,7 @@ import org.mariotaku.twidere.model.SupportTabSpec;
import org.mariotaku.twidere.provider.TwidereDataStore.CachedUsers;
import org.mariotaku.twidere.provider.TwidereDataStore.Filters;
import org.mariotaku.twidere.util.AsyncTwitterWrapper;
import org.mariotaku.twidere.util.ColorUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.ContentValuesCreator;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallback;
@ -167,7 +167,6 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
private static final String TAB_TYPE_MEDIA = "media";
private static final String TAB_TYPE_FAVORITES = "favorites";
private MediaLoaderWrapper mProfileImageLoader;
private ShapedImageView mProfileImageView;
private ImageView mProfileTypeView;
private ProfileBannerImageView mProfileBannerView;
@ -193,12 +192,13 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
private TextView mPagesErrorText;
private View mProfileNameBackground;
private View mProfileDetailsContainer;
private Relationship mRelationship;
private MediaLoaderWrapper mProfileImageLoader;
private SupportTabsAdapter mPagerAdapter;
private KeyboardShortcutsHandler mKeyboardShortcutsHandler;
private ParcelableUser mUser = null;
private ParcelableUser mUser;
private Relationship mRelationship;
private Locale mLocale;
private boolean mGetUserInfoLoaderInitialized, mGetFriendShipLoaderInitialized;
private int mBannerWidth;
@ -1454,7 +1454,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
}
mActionBarBackground.setOutlineAlphaFactor(tabOutlineAlphaFactor);
final ThemedActionBarActivity activity = (ThemedActionBarActivity) getActivity();
final ThemedAppCompatActivity activity = (ThemedAppCompatActivity) getActivity();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
setCompatToolbarOverlayAlpha(activity, factor * tabOutlineAlphaFactor);
@ -1465,7 +1465,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
final int themeId = activity.getCurrentThemeResourceId();
if (ThemeUtils.isDarkTheme(themeId)) {
stackedTabColor = getResources().getColor(R.color.background_color_action_bar_dark);
final int contrastColor = ColorUtils.getContrastYIQ(stackedTabColor, 192);
final int contrastColor = TwidereColorUtils.getContrastYIQ(stackedTabColor, 192);
mPagerIndicator.setIconColor(contrastColor);
mPagerIndicator.setLabelColor(contrastColor);
mPagerIndicator.setStripColor(mUserUiColor);
@ -1473,7 +1473,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener
stackedTabColor = mUserUiColor;
final int tabColor = (Integer) sArgbEvaluator.evaluate(tabOutlineAlphaFactor, stackedTabColor, mCardBackgroundColor);
((ColorDrawable) drawable).setColor(tabColor);
final int contrastColor = ColorUtils.getContrastYIQ(tabColor, 192);
final int contrastColor = TwidereColorUtils.getContrastYIQ(tabColor, 192);
mPagerIndicator.setIconColor(contrastColor);
mPagerIndicator.setLabelColor(contrastColor);
mPagerIndicator.setStripColor(contrastColor);

View File

@ -35,7 +35,7 @@ import android.widget.ImageView;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ColorUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import me.uucky.colorpicker.ColorPickerDialog;
@ -64,7 +64,7 @@ public class ColorPickerPreference extends DialogPreference implements DialogInt
protected void onBindView(@NonNull final View view) {
super.onBindView(view);
final ImageView imageView = (ImageView) view.findViewById(R.id.color);
imageView.setImageBitmap(ColorUtils.getColorPreviewBitmap(getContext(), getValue(), false));
imageView.setImageBitmap(TwidereColorUtils.getColorPreviewBitmap(getContext(), getValue(), false));
}
@Override

View File

@ -33,7 +33,7 @@ import com.twitter.Extractor;
import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.activity.support.BaseActionBarActivity;
import org.mariotaku.twidere.activity.support.BaseAppCompatActivity;
import org.mariotaku.twidere.app.TwidereApplication;
import org.mariotaku.twidere.menu.AccountActionProvider;
import org.mariotaku.twidere.model.ParcelableAccount;
@ -64,13 +64,13 @@ public class MultiSelectEventHandler implements Constants, ActionMode.Callback,
private ActionMode mActionMode;
private final BaseActionBarActivity mActivity;
private final BaseAppCompatActivity mActivity;
private AccountActionProvider mAccountActionProvider;
public static final int MENU_GROUP = 201;
public MultiSelectEventHandler(final BaseActionBarActivity activity) {
public MultiSelectEventHandler(final BaseAppCompatActivity activity) {
mActivity = activity;
}

View File

@ -42,11 +42,7 @@ public class RecyclerViewUtils {
public static void focusNavigate(RecyclerView recyclerView, LinearLayoutManager layoutManager, int currentFocus, int direction) {
if (direction == 0) return;
if (currentFocus < 0) {
final int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
final View firstVisibleView = layoutManager.findViewByPosition(firstVisibleItemPosition);
if (firstVisibleView != null) {
firstVisibleView.requestFocus();
}
focusFallback(layoutManager);
} else {
final View view;
if (direction > 0 && currentFocus == layoutManager.findLastVisibleItemPosition()) {
@ -68,8 +64,19 @@ public class RecyclerViewUtils {
}
if (viewToFocus == null) return;
final int nextPos = layoutManager.getPosition(viewToFocus);
if (nextPos < 0 || (nextPos - currentFocus) * direction < 0) return;
if (nextPos < 0 || (nextPos - currentFocus) * direction < 0) {
focusFallback(layoutManager);
return;
}
viewToFocus.requestFocus();
}
}
private static void focusFallback(LinearLayoutManager layoutManager) {
final int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
final View firstVisibleView = layoutManager.findViewByPosition(firstVisibleItemPosition);
if (firstVisibleView != null) {
firstVisibleView.requestFocus();
}
}
}

View File

@ -402,7 +402,7 @@ public class ThemeUtils implements Constants {
if (isTransparentBackground(backgroundOption)) {
return themeAlpha << 24 | (0x00FFFFFF & color);
} else if (isSolidBackground(backgroundOption)) {
return ColorUtils.getContrastYIQ(color, Color.WHITE, Color.BLACK);
return TwidereColorUtils.getContrastYIQ(color, Color.WHITE, Color.BLACK);
} else {
return color;
}
@ -438,7 +438,7 @@ public class ThemeUtils implements Constants {
}
public static int getContrastActionBarItemColor(Context context, int theme, int color) {
if (isDarkTheme(theme) || ColorUtils.getYIQLuminance(color) < 192) {
if (isDarkTheme(theme) || TwidereColorUtils.getYIQLuminance(color) < 192) {
//return light text color
return Color.WHITE;
}
@ -447,7 +447,7 @@ public class ThemeUtils implements Constants {
}
public static int getContrastActionBarTitleColor(Context context, int theme, int color) {
if (isDarkTheme(theme) || ColorUtils.getYIQLuminance(color) < 192) {
if (isDarkTheme(theme) || TwidereColorUtils.getYIQLuminance(color) < 192) {
//return light text color
return Color.WHITE;
}
@ -505,16 +505,16 @@ public class ThemeUtils implements Constants {
public static int getOptimalLinkColor(int linkColor, int color) {
final int[] yiq = new int[3];
ColorUtils.colorToYIQ(color, yiq);
TwidereColorUtils.colorToYIQ(color, yiq);
final int y = yiq[0];
ColorUtils.colorToYIQ(linkColor, yiq);
TwidereColorUtils.colorToYIQ(linkColor, yiq);
if (y < 32 && yiq[0] < 192) {
return linkColor;
} else if (y > 192 && yiq[0] > 32) {
return linkColor;
}
yiq[0] = yiq[0] + (y - yiq[0]) / 2;
return ColorUtils.YIQToColor(Color.alpha(linkColor), yiq);
return TwidereColorUtils.YIQToColor(Color.alpha(linkColor), yiq);
}
public static int getQuickSearchBarThemeResource(final Context context) {
@ -539,17 +539,6 @@ public class ThemeUtils implements Constants {
}
}
public static int getSettingsThemeResource(final Context context) {
return getSettingsThemeResource(getThemeNameOption(context));
}
public static int getSettingsThemeResource(final String name) {
if (VALUE_THEME_NAME_TWIDERE.equals(name) || VALUE_THEME_NAME_LIGHT.equals(name))
return R.style.Theme_Twidere_Settings_Light_DarkActionBar;
else if (VALUE_THEME_NAME_DARK.equals(name)) return R.style.Theme_Twidere_Settings_Dark;
return R.style.Theme_Twidere_Settings_Light_DarkActionBar;
}
public static Drawable getSupportActionBarBackground(final Context context, final int themeRes) {
@SuppressWarnings("ConstantConditions")
final TypedArray array = context.obtainStyledAttributes(null, new int[]{android.R.attr.background},
@ -798,7 +787,7 @@ public class ThemeUtils implements Constants {
if (!(activity instanceof IThemedActivity)) return;
final int themeRes = ((IThemedActivity) activity).getCurrentThemeResourceId();
final int themeColor = ((IThemedActivity) activity).getCurrentThemeColor();
final int contrastColor = ColorUtils.getContrastYIQ(themeColor, 192);
final int contrastColor = TwidereColorUtils.getContrastYIQ(themeColor, 192);
ViewUtils.setBackground(indicator, getActionBarStackedBackground(activity, themeRes, themeColor, true));
if (isDarkTheme(themeRes)) {
final int foregroundColor = getThemeForegroundColor(activity);
@ -840,6 +829,10 @@ public class ThemeUtils implements Constants {
return false;
}
public static boolean isSolidBackground(final String option) {
return VALUE_THEME_BACKGROUND_SOLID.equals(option);
}
public static boolean isTransparentBackground(final Context context) {
return isTransparentBackground(getThemeBackgroundOption(context));
}
@ -848,10 +841,6 @@ public class ThemeUtils implements Constants {
return VALUE_THEME_BACKGROUND_TRANSPARENT.equals(option);
}
public static boolean isSolidBackground(final String option) {
return VALUE_THEME_BACKGROUND_SOLID.equals(option);
}
public static boolean isWindowFloating(Context context, int theme) {
final TypedArray a;
if (theme != 0) {
@ -1041,8 +1030,8 @@ public class ThemeUtils implements Constants {
public static void wrapMenuIcon(ActionMenuView view, int colorDark, int colorLight, int... excludeGroups) {
final int itemBackgroundColor = ThemeUtils.getThemeBackgroundColor(view.getContext());
final int popupItemBackgroundColor = ThemeUtils.getThemeBackgroundColor(view.getContext(), view.getPopupTheme());
final int itemColor = ColorUtils.getContrastYIQ(itemBackgroundColor, colorDark, colorLight);
final int popupItemColor = ColorUtils.getContrastYIQ(popupItemBackgroundColor, colorDark, colorLight);
final int itemColor = TwidereColorUtils.getContrastYIQ(itemBackgroundColor, colorDark, colorLight);
final int popupItemColor = TwidereColorUtils.getContrastYIQ(popupItemBackgroundColor, colorDark, colorLight);
final Menu menu = view.getMenu();
final int childCount = view.getChildCount();
for (int i = 0, j = menu.size(), k = 0; i < j; i++) {
@ -1067,8 +1056,8 @@ public class ThemeUtils implements Constants {
final Resources resources = context.getResources();
final int colorDark = resources.getColor(R.color.action_icon_dark);
final int colorLight = resources.getColor(R.color.action_icon_light);
final int itemColor = ColorUtils.getContrastYIQ(backgroundColor, colorDark, colorLight);
final int popupItemColor = ColorUtils.getContrastYIQ(popupBackgroundColor, colorDark, colorLight);
final int itemColor = TwidereColorUtils.getContrastYIQ(backgroundColor, colorDark, colorLight);
final int popupItemColor = TwidereColorUtils.getContrastYIQ(popupBackgroundColor, colorDark, colorLight);
for (int i = 0, j = menu.size(), k = 0; i < j; i++) {
final MenuItem item = menu.getItem(i);
wrapMenuItemIcon(item, itemColor, excludeGroups);
@ -1127,8 +1116,10 @@ public class ThemeUtils implements Constants {
final ColorStateList tintList = ColorStateList.valueOf(tintColor);
final CompoundButton compoundButton = (CompoundButton) view;
ViewUtils.setButtonTintList(compoundButton, tintList);
} else {
// final ColorStateList tintList = ColorStateList.valueOf(tintColor);
// ViewCompat.setBackgroundTintList(view, tintList);
}
// TODO support TintableBackgroundView
}
@NonNull

View File

@ -30,7 +30,7 @@ import android.graphics.Rect;
/**
* Created by mariotaku on 15/1/8.
*/
public class ColorUtils {
public class TwidereColorUtils {
public static Bitmap getColorPreviewBitmap(final Context context, final int color, final boolean border) {
if (context == null) return null;

View File

@ -35,12 +35,11 @@ public class UserAgentUtils {
// You may uncomment next line if using Android Annotations library, otherwise just be sure to run it in on the UI thread
public static String getDefaultUserAgentString(Context context) {
if (Looper.myLooper() != Looper.getMainLooper()) throw new IllegalStateException();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return NewApiWrapper.getDefaultUserAgent(context);
}
try {
Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return NewApiWrapper.getDefaultUserAgent(context);
}
final Constructor<WebSettings> constructor = WebSettings.class.getDeclaredConstructor(Context.class, WebView.class);
constructor.setAccessible(true);
try {
WebSettings settings = constructor.newInstance(context, null);

View File

@ -52,11 +52,6 @@ public final class ViewUtils {
}
}
public static void setBackgroundTintList(final View view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setBackgroundTintList(view, list);
}
public static void setButtonTintList(CompoundButton view, ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setButtonTintList(view, list);
@ -140,10 +135,6 @@ public final class ViewUtils {
view.setOutlineProvider(new ViewOutlineProviderL(outlineProvider));
}
static void setBackgroundTintList(final View view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setBackgroundTintList(list);
}
static void setButtonTintList(final CompoundButton view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;

View File

@ -39,7 +39,7 @@ import android.widget.ImageView;
import android.widget.ProgressBar;
import org.mariotaku.twidere.R;
import org.mariotaku.twidere.util.ColorUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ViewUtils;
import org.mariotaku.twidere.view.iface.IHomeActionButton;
@ -76,7 +76,7 @@ public class HomeActionButtonCompat extends FrameLayout implements IHomeActionBu
if (child instanceof FrameLayout) {
final Drawable foreground = ((FrameLayout) child).getForeground();
if (foreground != null) {
foreground.setColorFilter(ColorUtils.getContrastYIQ(color, 192), Mode.MULTIPLY);
foreground.setColorFilter(TwidereColorUtils.getContrastYIQ(color, 192), Mode.MULTIPLY);
}
}

View File

@ -34,7 +34,7 @@ import org.mariotaku.twidere.R;
import org.mariotaku.twidere.adapter.MessageConversationAdapter;
import org.mariotaku.twidere.model.ParcelableDirectMessage.CursorIndices;
import org.mariotaku.twidere.model.ParcelableMedia;
import org.mariotaku.twidere.util.ColorUtils;
import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.SimpleValueSerializer;
import org.mariotaku.twidere.util.TwidereLinkify;
@ -98,7 +98,7 @@ public class MessageConversationViewHolder extends ViewHolder implements OnMedia
public void setMessageColor(int color) {
final ColorStateList colorStateList = ColorStateList.valueOf(color);
messageContent.setBubbleColor(colorStateList);
final int textLuminancePrimary = ColorUtils.getYIQLuminance(textColorPrimary);
final int textLuminancePrimary = TwidereColorUtils.getYIQLuminance(textColorPrimary);
final int textPrimaryDark, textPrimaryLight, textSecondaryDark, textSecondaryLight;
if (textLuminancePrimary < 128) {
textPrimaryDark = textColorPrimary;
@ -111,8 +111,8 @@ public class MessageConversationViewHolder extends ViewHolder implements OnMedia
textSecondaryDark = textColorSecondaryInverse;
textSecondaryLight = textColorSecondary;
}
final int textContrastPrimary = ColorUtils.getContrastYIQ(color, 192, textPrimaryDark, textPrimaryLight);
final int textContrastSecondary = ColorUtils.getContrastYIQ(color, 192, textSecondaryDark, textSecondaryLight);
final int textContrastPrimary = TwidereColorUtils.getContrastYIQ(color, 192, textPrimaryDark, textPrimaryLight);
final int textContrastSecondary = TwidereColorUtils.getContrastYIQ(color, 192, textSecondaryDark, textSecondaryLight);
text.setTextColor(textContrastPrimary);
text.setLinkTextColor(textContrastSecondary);
time.setTextColor(textContrastSecondary);

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.view.themed;
import android.content.Context;
import android.content.res.ColorStateList;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;
@ -45,6 +46,6 @@ public class ThemedAutoCompleteTextView extends AutoCompleteTextView implements
@Override
public void setThemeTintColor(ColorStateList color) {
ViewUtils.setBackgroundTintList(this, color);
ViewCompat.setBackgroundTintList(this, color);
}
}

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.view.themed;
import android.content.Context;
import android.content.res.ColorStateList;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.widget.EditText;
@ -45,6 +46,6 @@ public class ThemedEditText extends EditText implements IThemedView {
@Override
public void setThemeTintColor(ColorStateList color) {
ViewUtils.setBackgroundTintList(this, color);
ViewCompat.setBackgroundTintList(this, color);
}
}

View File

@ -21,6 +21,7 @@ package org.mariotaku.twidere.view.themed;
import android.content.Context;
import android.content.res.ColorStateList;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.widget.MultiAutoCompleteTextView;
@ -45,7 +46,7 @@ public class ThemedMultiAutoCompleteTextView extends MultiAutoCompleteTextView i
@Override
public void setThemeTintColor(ColorStateList color) {
ViewUtils.setBackgroundTintList(this, color);
ViewCompat.setBackgroundTintList(this, color);
setLinkTextColor(color);
setHighlightColor(color.getDefaultColor());
}

View File

@ -24,6 +24,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/element_spacing_normal"
android:paddingBottom="@dimen/element_spacing_normal"
android:paddingLeft="@dimen/element_spacing_large"
android:paddingRight="@dimen/element_spacing_large">

View File

@ -24,6 +24,9 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:selectableItemBackground"
android:focusable="true"
android:focusableInTouchMode="false"
android:orientation="vertical"
android:splitMotionEvents="false">

View File

@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AppCompatResource"
xmlns:android="http://schemas.android.com/apk/res/android">
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add_submenu"
android:icon="@drawable/ic_action_add"
android:showAsAction="always"
android:title="@string/add_tab">
android:title="@string/add_tab"
app:showAsAction="always">
<menu/>
</item>

View File

@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/add"
android:icon="@drawable/ic_action_add"
android:showAsAction="always"
android:title="@string/add_host_mapping"
tools:ignore="AppCompatResource"/>
app:showAsAction="always"
android:title="@string/add_host_mapping"/>
</menu>

View File

@ -18,10 +18,8 @@
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@id/reset"
android:title="@string/reset_to_default"
tools:ignore="AppCompatResource"/>
android:title="@string/reset_to_default"/>
</menu>

View File

@ -1,4 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Twidere - Twitter client for Android
~
~ Copyright (C) 2012-2015 Mariotaku Lee <mariotaku.lee@gmail.com>
~
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<menu>

View File

@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:ignore="AppCompatResource">
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@id/toggle"
android:actionLayout="@layout/action_item_switch"
android:showAsAction="always"
app:actionLayout="@layout/action_item_switch"
app:showAsAction="always"
android:title="@string/toggle"/>
</menu>

View File

@ -276,80 +276,8 @@
<item name="android:windowBackground">@color/nyan_background</item>
</style>
<style name="Theme.Twidere.Settings.Dark" parent="Theme.Base">
<!-- Colors -->
<item name="android:colorBackgroundCacheHint">@color/background_color_window_dark</item>
<!-- Window attributes -->
<!--<item name="android:windowAnimationStyle">@style/Animation.Twidere.Activity</item>-->
<item name="android:windowBackground">@color/background_color_window_dark</item>
<!-- ActionBar styles -->
<item name="android:actionBarStyle">@android:style/Widget.DeviceDefault.ActionBar.Solid
</item>
<!-- Custom view styles -->
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.ProfileImage</item>
<item name="profileImageStyleLarge">@style/Widget.ProfileImage.Large</item>
<item name="cardItemBackgroundColor">@color/background_color_card_item_dark</item>
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_light</item>
<item name="menuIconColorActionBar">?menuIconColor</item>
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
</style>
<style name="Theme.Twidere.Settings.Light" parent="Theme.Base.Light">
<!-- Colors -->
<item name="android:colorBackgroundCacheHint">@color/background_color_window_light</item>
<!-- Window attributes -->
<!--<item name="android:windowAnimationStyle">@style/Animation.Twidere.Activity</item>-->
<item name="android:windowBackground">@color/background_color_window_light</item>
<!-- Custom view styles -->
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.Light.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.Light.ProfileImage</item>
<item name="profileImageStyleLarge">@style/Widget.Light.ProfileImage.Large</item>
<item name="cardItemBackgroundColor">@color/background_color_card_item_light</item>
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_dark</item>
<item name="menuIconColorActionBar">?menuIconColor</item>
<item name="messageBubbleColor">@color/message_bubble_color_light</item>
</style>
<style name="Theme.Twidere.Settings.Light.DarkActionBar" parent="Theme.Base.Light.DarkActionBar">
<!-- Colors -->
<!--<item name="android:colorBackgroundCacheHint">@color/bg_color_light</item>-->
<item name="android:windowBackground">@color/background_color_window_light</item>
<!-- Custom view styles -->
<!-- Card UI styles -->
<item name="cardActionButtonStyle">@style/Widget.Light.CardActionButton</item>
<item name="profileImageStyle">@style/Widget.Light.ProfileImage</item>
<item name="profileImageStyleLarge">@style/Widget.Light.ProfileImage.Large</item>
<item name="cardItemBackgroundColor">@color/background_color_card_item_light</item>
<!-- Twidere specific styles -->
<item name="menuIconColor">@color/action_icon_dark</item>
<item name="menuIconColorActionBar">@color/action_icon_light</item>
<item name="messageBubbleColor">@color/message_bubble_color_dark</item>
</style>
<style name="Theme.Twidere.Wizard" parent="Theme.Twidere.Settings.Light">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<style name="Theme.Twidere.Wizard" parent="Theme.Twidere.Light">
<item name="windowActionBar">false</item>
<item name="android:windowBackground">@color/background_color_window_settings_wizard</item>
<item name="android:colorActivatedHighlight">@color/branding_color</item>
</style>