diff --git a/twidere/build.gradle b/twidere/build.gradle index ca3145d5c..ef3a3df12 100644 --- a/twidere/build.gradle +++ b/twidere/build.gradle @@ -55,7 +55,6 @@ android { repositories { jcenter() maven { url 'https://repo.commonsware.com.s3.amazonaws.com' } - maven { url 'https://github.com/suckgamony/RapidDecoder/raw/master/repository' } maven { url "https://jitpack.io" } } diff --git a/twidere/src/main/assets/blackberry/android.cfg b/twidere/src/main/assets/blackberry/android.cfg new file mode 100644 index 000000000..8fd3b2822 --- /dev/null +++ b/twidere/src/main/assets/blackberry/android.cfg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/twidere/src/main/java/com/meizu/flyme/reflect/ActionBarProxy.java b/twidere/src/main/java/com/meizu/flyme/reflect/ActionBarProxy.java new file mode 100755 index 000000000..a3a69646f --- /dev/null +++ b/twidere/src/main/java/com/meizu/flyme/reflect/ActionBarProxy.java @@ -0,0 +1,151 @@ +/* + * 版本:1.0 + * 日期:2014-10-16 + * Copyright (C) 2010 中国广东省珠海市魅族科技有限公司版权所有 + * 修改历史记录: + * 2014-10-16 初始版本创建 + */ +package com.meizu.flyme.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import android.app.ActionBar; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.util.TypedValue; + + +/** + *

用以调用Flyme定制的API

+ * + * @author MEIZU.SDK Team + * + */ +public class ActionBarProxy extends Proxy{ + + private static Class sClass = ActionBar.class; + private static Method sSetBackButtonDrawableMethod; + private static Method sSetActionModeHeaderHiddenMethod; + private static Method sSetActionBarViewCollapsableMethod; + private static Method sSetOverFlowButtonDrawableMethod; + private static Method sSetTabsShowAtBottom; + + + /** + * 判断设备是否支持smart bar + * @return boolean true支持,false不支持 + */ + public static boolean hasSmartBar() { + try { + Method method = Class.forName("android.os.Build").getMethod( + "hasSmartBar"); + return ((Boolean) method.invoke(null)).booleanValue(); + } catch (Exception e) { + } + return false; + } + + /** + * 设置返回按钮图标 + * @param actionbar 相应的ActionBar参数 + * @param backIcon 返回按键的Icon + * @return boolean 执行结果 + */ + public static boolean SetBackButtonDrawable(android.app.ActionBar actionbar, + Drawable backIcon) { + sSetBackButtonDrawableMethod = getMethod(sSetBackButtonDrawableMethod, sClass, "setBackButtonDrawable", new Class[] { Drawable.class }); + return invoke(sSetBackButtonDrawableMethod, actionbar, backIcon); + } + + /** + * 设置more按钮图标 + * @return boolean 执行结果 + */ + public static boolean SetOverFlowButtonDrawable(android.app.ActionBar actionbar, + Drawable drawable) { + sSetOverFlowButtonDrawableMethod = getMethod(sSetOverFlowButtonDrawableMethod, sClass, "setOverFlowButtonDrawable", new Class[] { Drawable.class }); + return invoke(sSetOverFlowButtonDrawableMethod, actionbar, drawable); + } + + + /** + * 设置ActionMode顶栏是否隐藏。 + * @param bar 对应的ActionBar + * @param hide为true表示隐藏 + * @return boolean 执行结果 + */ + public static boolean setActionModeHeaderHidden(ActionBar bar, boolean hide) { + sSetActionModeHeaderHiddenMethod = getMethod(sSetActionModeHeaderHiddenMethod, sClass, "setActionModeHeaderHidden", boolean.class); + return invoke(sSetActionModeHeaderHiddenMethod, bar, hide); + } + + + /** + * 设置ActionBar顶栏无显示内容时是否隐藏。 + * @param bar + * @param collapsable + * @return boolen执行结果 + */ + public static boolean setActionBarViewCollapsable(ActionBar bar, boolean collapsable) { + sSetActionBarViewCollapsableMethod = getMethod(sSetActionBarViewCollapsableMethod, sClass, "setActionBarViewCollapsable", boolean.class); + return invoke(sSetActionBarViewCollapsableMethod, bar, collapsable); + } + + /** + *

+ * 设置ActionBar Tabs显示在底栏,不过需要配合 + * android:uiOptions="splitActionBarWhenNarrow" + *

+ * @param actionbar + * @param showAtBottom + * @return boolen 执行结果 + */ + public static boolean setActionBarTabsShowAtBottom( + android.app.ActionBar actionbar, boolean showAtBottom) { + sSetTabsShowAtBottom = getMethod(sSetTabsShowAtBottom, sClass, "setTabsShowAtBottom", boolean.class); + return invoke(sSetTabsShowAtBottom, actionbar, showAtBottom); + } + + + /** + * 获取actionbar高度 + * @param context 上下文 + * @param actionbar 对应的ActionBar + * @return int ActionBar的高度值 + */ + public static int getActionBarHeight(Context context, ActionBar actionbar) { + if(actionbar != null){ + TypedValue tv = new TypedValue(); + if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, + tv, true)) { + return TypedValue.complexToDimensionPixelSize(tv.data, context + .getResources().getDisplayMetrics()); + } + return actionbar.getHeight(); + } + return 0; + } + + /** + * 获取smartbar高度 + * @param context + * @param actionbar + * @return int SmartBar的高度值 + */ + public static int getSmartBarHeight(Context context,ActionBar actionbar) { + if(actionbar != null){ + try { + Class c = Class.forName("com.android.internal.R$dimen"); + Object obj = c.newInstance(); + Field field = c.getField("mz_action_button_min_height"); + int height = Integer.parseInt(field.get(obj).toString()); + return context.getResources().getDimensionPixelSize(height); + } catch (Exception e) { + e.printStackTrace(); + } + actionbar.getHeight(); + } + return 0; + } +} diff --git a/twidere/src/main/java/com/meizu/flyme/reflect/InputMethodProxy.java b/twidere/src/main/java/com/meizu/flyme/reflect/InputMethodProxy.java new file mode 100755 index 000000000..e7d36c97e --- /dev/null +++ b/twidere/src/main/java/com/meizu/flyme/reflect/InputMethodProxy.java @@ -0,0 +1,35 @@ +package com.meizu.flyme.reflect; + +import java.lang.reflect.Method; + +import android.content.Context; +import android.view.inputmethod.InputMethodManager; + +/** + * @author MEIZU.SDK Team + * + */ +public class InputMethodProxy extends Proxy { + + private final static String TAG = "InputMethod"; + private static Class sClass = InputMethodManager.class; + private static Method sSetMzInputThemeLight; + + + /** + * 设置导航栏和输入法背景颜色,在App启动第一个Actiity onCreate方法中调用该方法,执行成功后,App中使用系统输入法都是白色样式 + * @param context 上下文 + * @param light 是否把导航栏和输入法背景设置为白色 + * @return boolean 执行结果,成功执行返回true + */ + public static boolean setInputThemeLight(Context context, boolean light) { + sSetMzInputThemeLight = getMethod(sSetMzInputThemeLight, sClass, + "setMzInputThemeLight", boolean.class); + InputMethodManager imm = (InputMethodManager) context + .getSystemService(Context.INPUT_METHOD_SERVICE); + if (imm != null) { + return invoke(sSetMzInputThemeLight, imm, light); + } + return false; + } +} diff --git a/twidere/src/main/java/com/meizu/flyme/reflect/NotificationProxy.java b/twidere/src/main/java/com/meizu/flyme/reflect/NotificationProxy.java new file mode 100755 index 000000000..9370b309d --- /dev/null +++ b/twidere/src/main/java/com/meizu/flyme/reflect/NotificationProxy.java @@ -0,0 +1,79 @@ +/* + * 版本:1.0 + * 日期:2014-10-16 + * Copyright (C) 2010 中国广东省珠海市魅族科技有限公司版权所有 + * 修改历史记录: + * 2014-10-16 初始版本创建 + */ +package com.meizu.flyme.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import android.app.Notification; +import android.app.Notification.Builder; + + +/** + *

用以调用Flyme定制的API

+ * + * @author MEIZU.SDK Team + * + */ +public class NotificationProxy extends Proxy { + + private static Class sClass = Notification.Builder.class; + private static Field sField = null; + private static Object sObject = null; + private static Method sSetProgressBarStype = null; + private static Method sSetCircleProgressBarColor = null; + private static Method ssetCircleProgressRimColor = null; + + /** + * 设置ProgressBar的类型 + * @param builder 为Notification.Builder类 + * @param isCircle true为圆环形,false为普通直线形 + */ + public static void setProgressBarStype(Builder builder, boolean isCircle){ + try{ + sField = sClass.getField("mFlymeNotificationBuilder"); + sObject = sField.get(builder); + sSetProgressBarStype = sField.getType().getDeclaredMethod("setCircleProgressBar", boolean.class); + + if(sObject != null){ + invoke(sSetProgressBarStype, sObject, isCircle); + } + }catch(Exception ignore){ + ignore.printStackTrace(); + } + } + + /** + * 设置圆环形ProgressBar活动进度条的颜色 + * @param color 为颜色值 + */ + public static void setCircleProgressBarColor(int color) { + try{ + if(sField != null && sObject != null){ + sSetCircleProgressBarColor = sField.getType().getDeclaredMethod("setCircleProgressBarColor", int.class); + invoke(sSetCircleProgressBarColor, sObject, color); + } + }catch(Exception ignore){ + ignore.printStackTrace(); + } + } + + /** + * 设置圆环形ProgressBar外边环的颜色 + * @param color 为颜色值 + */ + public static void setCircleProgressRimColor(int color) { + try{ + if(sField != null && sObject != null){ + ssetCircleProgressRimColor = sField.getType().getDeclaredMethod("ssetCircleProgressRimColor", int.class); + invoke(ssetCircleProgressRimColor, sObject, color); + } + }catch(Exception ignore){ + ignore.printStackTrace(); + } + } +} diff --git a/twidere/src/main/java/com/meizu/flyme/reflect/Proxy.java b/twidere/src/main/java/com/meizu/flyme/reflect/Proxy.java new file mode 100755 index 000000000..dfa0d43e2 --- /dev/null +++ b/twidere/src/main/java/com/meizu/flyme/reflect/Proxy.java @@ -0,0 +1,50 @@ +package com.meizu.flyme.reflect; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class Proxy { + + /** + * 获取方法 + * @param method + * @param clazz + * @param name + * @param parameterTypes + * @return method + */ + protected static Method getMethod (Method method, Class clazz, String name, Class... parameterTypes) { + if (method == null) { + try { + method = clazz.getMethod(name, parameterTypes); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + } + return method; + } + + /** + * 执行方法 + * @param method 方法 + * @param obj 对像 + * @param args 参数 + * @return boolean 执行结果 + */ + protected static boolean invoke (Method method, Object obj, Object... args) { + if (method != null) { + try { + method.invoke(obj, args); + return true; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + return false; + } + +} diff --git a/twidere/src/main/java/com/meizu/flyme/reflect/StatusBarProxy.java b/twidere/src/main/java/com/meizu/flyme/reflect/StatusBarProxy.java new file mode 100755 index 000000000..3e77cf9f0 --- /dev/null +++ b/twidere/src/main/java/com/meizu/flyme/reflect/StatusBarProxy.java @@ -0,0 +1,106 @@ +package com.meizu.flyme.reflect; + +import android.annotation.TargetApi; +import android.content.Context; +import android.os.Build; +import android.util.Log; +import android.view.Window; +import android.view.WindowManager; + +import java.lang.reflect.Field; + +public class StatusBarProxy { + private final static String TAG = "StatusBar"; + + + /** + * 设置状态栏图标为深色和魅族特定的文字风格 + * @param window 需要设置的窗口 + * @param dark 是否把状态栏颜色设置为深色 + * @return boolean 成功执行返回true + */ + public static boolean setStatusBarDarkIcon(Window window, boolean dark) { + boolean result = false; + if (window != null) { + try { + WindowManager.LayoutParams lp = window.getAttributes(); + Field darkFlag = WindowManager.LayoutParams.class + .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON"); + Field meizuFlags = WindowManager.LayoutParams.class + .getDeclaredField("meizuFlags"); + darkFlag.setAccessible(true); + meizuFlags.setAccessible(true); + int bit = darkFlag.getInt(null); + int value = meizuFlags.getInt(lp); + if (dark) { + value |= bit; + } else { + value &= ~bit; + } + meizuFlags.setInt(lp, value); + window.setAttributes(lp); + result = true; + } catch (Exception e) { + Log.e(TAG, "setStatusBarDarkIcon: failed"); + } + } + return result; + } + + /** + * 设置沉浸式窗口,设置成功后,状态栏则透明显示 + * @param window 需要设置的窗口 + * @param immersive 是否把窗口设置为沉浸 + * @return boolean 成功执行返回true + */ + @TargetApi(Build.VERSION_CODES.KITKAT) + public static boolean setImmersedWindow(Window window, boolean immersive) { + boolean result = false; + if (window != null) { + WindowManager.LayoutParams lp = window.getAttributes(); + int trans_status = 0; + Field flags; + if (android.os.Build.VERSION.SDK_INT < 19) { + try { + trans_status = 1 << 6; + flags = lp.getClass().getDeclaredField("meizuFlags"); + flags.setAccessible(true); + int value = flags.getInt(lp); + if (immersive) { + value = value | trans_status; + } else { + value = value & ~trans_status; + } + flags.setInt(lp, value); + result = true; + } catch (Exception e) { + Log.e(TAG, "setImmersedWindow: failed"); + } + } else { + lp.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; + window.setAttributes(lp); + result = true; + } + } + return result; + } + + /** + * 获取状态栏高度 + * @param context 上下文 + * @return int 状态栏高度 + */ + public static int getStatusBarHeight(Context context) { + try { + Class c = Class.forName("com.android.internal.R$dimen"); + Object obj = c.newInstance(); + Field field = c.getField("status_bar_height"); + int height = Integer.parseInt(field.get(obj).toString()); + return context.getResources().getDimensionPixelSize(height); + } catch (Exception e) { + e.printStackTrace(); + } + return 75; + } + +} diff --git a/twidere/src/main/java/com/meizu/flyme/reflect/WallpaperManagerProxy.java b/twidere/src/main/java/com/meizu/flyme/reflect/WallpaperManagerProxy.java new file mode 100755 index 000000000..c8ea76016 --- /dev/null +++ b/twidere/src/main/java/com/meizu/flyme/reflect/WallpaperManagerProxy.java @@ -0,0 +1,61 @@ +package com.meizu.flyme.reflect; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import java.lang.reflect.Method; + +import android.app.WallpaperManager; +import android.content.Context; + +public class WallpaperManagerProxy extends Proxy { + private final static String TAG = "WallpaperManagerProxy"; + private static Class sClass = WallpaperManager.class; + private static Method sSetLockWallpaper; + + /** + * 从参数所提供的路径,读取图片并设置为锁屏界面 + * @param context 上下文 + * @param path 图片的路径 + * @return boolean 成功执行返回true + */ + public static boolean setLockWallpaper(Context context, String path) { + boolean result = false; + WallpaperManager wm = WallpaperManager.getInstance(context); + try { + InputStream is = new FileInputStream(path); + sSetLockWallpaper = getMethod(sSetLockWallpaper, sClass, + "setStreamToLockWallpaper", InputStream.class); + if (wm != null) { + result = invoke(sSetLockWallpaper, wm, is); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return result; + } + + /** + * 从参数所提供的路径,读取图片并设置为Home界面 + * @param context 上下文 + * @param path 图片的路径 + * @return boolean 成功执行返回true + */ + public static boolean setHomeWallpaper(Context context, String path) { + boolean result = false; + WallpaperManager wm = WallpaperManager.getInstance(context); + try { + InputStream is = new FileInputStream(path); + wm.setStream(is); + result = true; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java index 32cd446db..991a4c310 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java @@ -38,6 +38,8 @@ import android.view.ViewGroup; import android.view.WindowManager.LayoutParams; import android.widget.FrameLayout; +import com.meizu.flyme.reflect.StatusBarProxy; + import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.iface.IThemedActivity; @@ -45,6 +47,7 @@ import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.ThemeUtils; +import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.support.ViewSupport; import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; @@ -291,13 +294,15 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity private void setupTintStatusBar() { if (mMainContent == null) return; - final int color = getCurrentThemeColor(); final int alpha = ThemeUtils.isTransparentBackground(getThemeBackgroundOption()) ? getCurrentThemeBackgroundAlpha() : 0xFF; + final int statusBarColor; if (ThemeUtils.isDarkTheme(getCurrentThemeResourceId())) { - mMainContent.setColor(getResources().getColor(R.color.background_color_action_bar_dark), alpha); + statusBarColor = getResources().getColor(R.color.background_color_action_bar_dark); } else { - mMainContent.setColor(color, alpha); + statusBarColor = getCurrentThemeColor(); } + mMainContent.setColor(statusBarColor, alpha); + StatusBarProxy.setStatusBarDarkIcon(getWindow(), TwidereColorUtils.getYIQLuminance(statusBarColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD); mMainContent.setDrawShadow(false); mMainContent.setDrawColor(true); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseDialogWhenLargeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseDialogWhenLargeActivity.java deleted file mode 100644 index aead70f77..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseDialogWhenLargeActivity.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2015 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.activity.support; - -import android.os.Build; -import android.os.Bundle; -import android.support.v7.app.ActionBar; -import android.support.v7.widget.ActionMenuView; -import android.support.v7.widget.Toolbar; -import android.view.Menu; -import android.view.WindowManager.LayoutParams; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.util.support.ViewSupport; -import org.mariotaku.twidere.view.iface.TintedStatusLayout; - -/** - * Created by mariotaku on 15/4/17. - */ -public class BaseDialogWhenLargeActivity extends BaseAppCompatActivity { - - private TintedStatusLayout mMainContent; - - @Override - public int getThemeResourceId() { - return ThemeUtils.getDialogWhenLargeThemeResource(this); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - setupWindow(); - super.onCreate(savedInstanceState); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - final boolean result = super.onPrepareOptionsMenu(menu); - if (!shouldSetActionItemColor()) return result; - final Toolbar toolbar = peekActionBarToolbar(); - if (toolbar != null) { - final int themeColor = getCurrentThemeColor(); - final int themeId = getCurrentThemeResourceId(); - final int itemColor = ThemeUtils.getContrastActionBarItemColor(this, themeId, themeColor); - ThemeUtils.setActionBarOverflowColor(toolbar, itemColor); - ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(toolbar, ActionMenuView.class), itemColor, itemColor); - } - return result; - } - - @Override - public void onContentChanged() { - super.onContentChanged(); - mMainContent = (TintedStatusLayout) findViewById(R.id.main_content); - setupTintStatusBar(); - } - - protected TintedStatusLayout getMainContent() { - return mMainContent; - } - - protected boolean isActionBarOutlineEnabled() { - return true; - } - - protected boolean shouldSetActionItemColor() { - return true; - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - setupActionBar(); - } - - private void setupActionBar() { - final ActionBar actionBar = getSupportActionBar(); - if (actionBar == null) return; - - final int themeColor = getCurrentThemeColor(); - final int themeId = getCurrentThemeResourceId(); - final String option = getThemeBackgroundOption(); - final int titleColor = ThemeUtils.getContrastActionBarTitleColor(this, themeId, themeColor); - final int actionBarItemsColor = ThemeUtils.getContrastActionBarItemColor(this, themeId, themeColor); - ThemeUtils.applyActionBarBackground(actionBar, this, themeId, themeColor, option, isActionBarOutlineEnabled()); - final Toolbar toolbar = peekActionBarToolbar(); - if (toolbar != null) { - ThemeUtils.setToolBarColor(toolbar, titleColor, actionBarItemsColor); - } else { - ThemeUtils.setActionBarColor(getWindow(), getSupportActionBar(), titleColor, actionBarItemsColor); - } - } - - private void setupTintStatusBar() { - if (mMainContent == null) return; - - final int color = getCurrentThemeColor(); - final int alpha = ThemeUtils.isTransparentBackground(getThemeBackgroundOption()) ? getCurrentThemeBackgroundAlpha() : 0xFF; - if (ThemeUtils.isDarkTheme(getCurrentThemeResourceId())) { - mMainContent.setColor(getResources().getColor(R.color.background_color_action_bar_dark), alpha); - } else { - mMainContent.setColor(color, alpha); - } - - mMainContent.setDrawShadow(false); - mMainContent.setDrawColor(true); - mMainContent.setFactor(1); - } - - private void setupWindow() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - getWindow().addFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS); - } - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java index be7afe65f..f41658477 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ComposeActivity.java @@ -61,7 +61,6 @@ import android.support.v7.widget.RecyclerView.ItemDecoration; import android.support.v7.widget.RecyclerView.State; import android.support.v7.widget.RecyclerView.ViewHolder; import android.text.Editable; -import android.text.Spanned; import android.text.TextUtils; import android.text.TextWatcher; import android.util.Log; @@ -203,25 +202,6 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL return ThemeUtils.getComposeThemeResource(this); } - public static boolean isFinishedComposing(CharSequence text) { - if (!(text instanceof Spanned)) return true; - final Spanned spanned = (Spanned) text; - try { - final Class cls = Class.forName("android.text.style.SpellCheckSpan"); - if (spanned.getSpans(0, spanned.length(), cls).length > 0) return false; - } catch (Exception ignored) { - - } - try { - final Class cls = Class.forName("android.view.inputmethod.ComposingText"); - if (spanned.getSpans(0, spanned.length(), cls).length > 0) return false; - } catch (Exception ignored) { - - } -// if (spanned.getSpans(0, spanned.length(), SpanWatcher.class).length > 0) return false; - return true; - } - @Override public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { switch (requestCode) { @@ -620,6 +600,49 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL linearLayoutManager.setStackFromEnd(true); mAccountSelector.setLayoutManager(linearLayoutManager); mAccountSelector.addItemDecoration(new SpacingItemDecoration(this)); + mAccountSelector.setItemAnimator(new RecyclerView.ItemAnimator() { + @Override + public void runPendingAnimations() { + + } + + @Override + public boolean animateRemove(ViewHolder holder) { + return false; + } + + @Override + public boolean animateAdd(ViewHolder holder) { + return false; + } + + @Override + public boolean animateMove(ViewHolder holder, int fromX, int fromY, int toX, int toY) { + Log.d(LOGTAG, String.format("animateMove")); + return false; + } + + @Override + public boolean animateChange(ViewHolder oldHolder, ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) { + Log.d(LOGTAG, String.format("animateChange")); + return false; + } + + @Override + public void endAnimation(ViewHolder item) { + Log.d(LOGTAG, String.format("endAnimation")); + } + + @Override + public void endAnimations() { + + } + + @Override + public boolean isRunning() { + return false; + } + }); mAccountsAdapter = new AccountIconsAdapter(this); mAccountSelector.setAdapter(mAccountsAdapter); mAccountsAdapter.setAccounts(ParcelableAccount.getAccounts(this, false, false)); @@ -1271,6 +1294,7 @@ public class ComposeActivity extends ThemedFragmentActivity implements LocationL private ParcelableAccount[] mAccounts; public AccountIconsAdapter(ComposeActivity activity) { + setHasStableIds(true); mActivity = activity; mInflater = activity.getLayoutInflater(); mImageLoader = TwidereApplication.getInstance(activity).getMediaLoaderWrapper(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java index 71ff804d0..439920f5d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/HomeActivity.java @@ -64,6 +64,7 @@ import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.CanvasTransformer; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnClosedListener; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.OnOpenedListener; +import com.meizu.flyme.reflect.StatusBarProxy; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; @@ -340,15 +341,15 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); mMultiSelectHandler = new MultiSelectEventHandler(this); mMultiSelectHandler.dispatchOnCreate(); - if (!Utils.hasAccount(this)) { - final Intent signInIntent = new Intent(INTENT_ACTION_TWITTER_LOGIN); - signInIntent.setClass(this, SignInActivity.class); - startActivity(signInIntent); - finish(); - return; - } else { - notifyAccountsChanged(); - } +// if (!Utils.hasAccount(this)) { +// final Intent signInIntent = new Intent(INTENT_ACTION_TWITTER_LOGIN); +// signInIntent.setClass(this, SignInActivity.class); +// startActivity(signInIntent); +// finish(); +// return; +// } else { +// notifyAccountsChanged(); +// } final Intent intent = getIntent(); if (openSettingsWizard()) { finish(); @@ -366,7 +367,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen ThemeUtils.applyBackground(mTabIndicator); mPagerAdapter = new SupportTabsAdapter(this, getSupportFragmentManager(), mTabIndicator, mTabColumns); mViewPager.setAdapter(mPagerAdapter); - mViewPager.setOffscreenPageLimit(3); +// mViewPager.setOffscreenPageLimit(3); mTabIndicator.setViewPager(mViewPager); mTabIndicator.setOnPageChangeListener(this); mTabIndicator.setColumns(mTabColumns); @@ -490,14 +491,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen } public void notifyAccountsChanged() { - if (mPreferences == null) return; -// final long[] accountIds = getAccountIds(this); -// final long default_id = mPreferences.getLong(KEY_DEFAULT_ACCOUNT_ID, -1); -// if (accountIds == null || accountIds.length == 0) { -// finish(); -// } else if (accountIds.length > 0 && !ArrayUtils.contains(accountIds, default_id)) { -// mPreferences.edit().putLong(KEY_DEFAULT_ACCOUNT_ID, accountIds[0]).apply(); -// } } @Subscribe @@ -834,6 +827,7 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen mColorStatusFrameLayout.setDrawColor(true); mColorStatusFrameLayout.setDrawShadow(false); mColorStatusFrameLayout.setColor(statusBarColor, actionBarAlpha); + StatusBarProxy.setStatusBarDarkIcon(getWindow(), TwidereColorUtils.getYIQLuminance(statusBarColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD); mColorStatusFrameLayout.setFactor(1); mTabIndicator.setAlpha(actionBarAlpha / 255f); mActionsButton.setAlpha(actionBarAlpha / 255f); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java index 127b52506..936aab2b9 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/LinkHandlerActivity.java @@ -43,6 +43,8 @@ import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager.LayoutParams; +import com.meizu.flyme.reflect.StatusBarProxy; + import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.iface.IControlBarActivity; import org.mariotaku.twidere.fragment.iface.IBaseFragment; @@ -56,6 +58,7 @@ import org.mariotaku.twidere.util.KeyboardShortcutsHandler.KeyboardShortcutCallb import org.mariotaku.twidere.util.MultiSelectEventHandler; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.TwidereActionModeForChildListener; +import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.support.ActivitySupport; import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat; @@ -273,18 +276,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System actionBar.setSubtitle(subtitle); } - @Override - protected boolean onPrepareOptionsPanel(View view, Menu menu) { - final Toolbar toolbar = peekActionBarToolbar(); - final boolean result = super.onPrepareOptionsPanel(view, menu); - if (mActionBarItemsColor != 0 && toolbar != null) { - toolbar.setTitleTextColor(mActionBarItemsColor); - toolbar.setSubtitleTextColor(mActionBarItemsColor); - ThemeUtils.setActionBarOverflowColor(toolbar, mActionBarItemsColor); - } - return result; - } - @Override public void onContentChanged() { super.onContentChanged(); @@ -363,9 +354,14 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System break; } } - if (actionBarItemsColor != 0) { + if (actionBarItemsColor != 0 && shouldSetActionItemColor()) { final int titleColor = ThemeUtils.getContrastActionBarTitleColor(this, themeId, themeColor); - ThemeUtils.setActionBarColor(getWindow(), actionBar, titleColor, actionBarItemsColor); + final Toolbar toolbar = peekActionBarToolbar(); + if (toolbar != null) { + ThemeUtils.setToolBarColor(toolbar, titleColor, actionBarItemsColor); + } else { + ThemeUtils.setActionBarColor(getWindow(), getSupportActionBar(), titleColor, actionBarItemsColor); + } } mActionBarItemsColor = actionBarItemsColor; } @@ -380,13 +376,15 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System mMainContent.setDrawShadow(false); mMainContent.setDrawColor(true); mMainContent.setFactor(1); - final int color = getCurrentThemeColor(); final int alpha = ThemeUtils.isTransparentBackground(getThemeBackgroundOption()) ? getCurrentThemeBackgroundAlpha() : 0xFF; + final int statusBarColor; if (ThemeUtils.isDarkTheme(getCurrentThemeResourceId())) { - mMainContent.setColor(getResources().getColor(R.color.background_color_action_bar_dark), alpha); + statusBarColor = getResources().getColor(R.color.background_color_action_bar_dark); } else { - mMainContent.setColor(color, alpha); + statusBarColor = getCurrentThemeColor(); } + mMainContent.setColor(statusBarColor, alpha); + StatusBarProxy.setStatusBarDarkIcon(getWindow(), TwidereColorUtils.getYIQLuminance(statusBarColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD); break; } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java index 5a196f4af..363eaa2d2 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/SignInActivity.java @@ -56,6 +56,8 @@ import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Toast; +import com.meizu.flyme.reflect.StatusBarProxy; + import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.SettingsActivity; import org.mariotaku.twidere.app.TwidereApplication; @@ -70,6 +72,7 @@ import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.AuthenticityTokenEx import org.mariotaku.twidere.util.OAuthPasswordAuthenticator.WrongUserPassException; import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ThemeUtils; +import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.net.OkHttpClientFactory; import org.mariotaku.twidere.util.net.TwidereHostResolverFactory; @@ -556,13 +559,15 @@ public class SignInActivity extends BaseAppCompatActivity implements TwitterCons private void setupTintStatusBar() { if (mMainContent == null) return; - final int color = getCurrentThemeColor(); final int alpha = ThemeUtils.isTransparentBackground(getThemeBackgroundOption()) ? getCurrentThemeBackgroundAlpha() : 0xFF; + final int statusBarColor; if (ThemeUtils.isDarkTheme(getCurrentThemeResourceId())) { - mMainContent.setColor(getResources().getColor(R.color.background_color_action_bar_dark), alpha); + statusBarColor = getResources().getColor(R.color.background_color_action_bar_dark); } else { - mMainContent.setColor(color, alpha); + statusBarColor = getCurrentThemeColor(); } + mMainContent.setColor(statusBarColor, alpha); + StatusBarProxy.setStatusBarDarkIcon(getWindow(), TwidereColorUtils.getYIQLuminance(statusBarColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD); mMainContent.setDrawShadow(false); mMainContent.setDrawColor(true); diff --git a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java index ead897b70..783ed69f8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java +++ b/twidere/src/main/java/org/mariotaku/twidere/app/TwidereApplication.java @@ -203,7 +203,6 @@ public class TwidereApplication extends MultiDexApplication implements Constants public SQLiteDatabase getSQLiteDatabase() { if (mDatabase != null) return mDatabase; - StrictModeUtils.checkDiskIO(); return mDatabase = getSQLiteOpenHelper().getWritableDatabase(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentListViewFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentListViewFragment.java index 2dbd4a19c..9c54ef0b7 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentListViewFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentListViewFragment.java @@ -93,8 +93,8 @@ public abstract class AbsContentListViewFragment extends @Override public void setControlVisible(boolean visible) { final FragmentActivity activity = getActivity(); - if (activity instanceof BaseAppCompatActivity) { - ((BaseAppCompatActivity) activity).setControlBarVisibleAnimate(visible); + if (activity instanceof IControlBarActivity) { + ((IControlBarActivity) activity).setControlBarVisibleAnimate(visible); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentRecyclerViewFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentRecyclerViewFragment.java index be759857d..221382fa8 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentRecyclerViewFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsContentRecyclerViewFragment.java @@ -130,8 +130,8 @@ public abstract class AbsContentRecyclerViewFragment + * + * 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 . + */ + +package org.mariotaku.twidere.fragment.support; + +import android.graphics.Rect; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.view.ViewPager; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.mariotaku.twidere.R; +import org.mariotaku.twidere.adapter.support.SupportTabsAdapter; +import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; +import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface; +import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback; +import org.mariotaku.twidere.graphic.EmptyDrawable; +import org.mariotaku.twidere.util.ThemeUtils; +import org.mariotaku.twidere.view.TabPagerIndicator; + +public class ListsFragment extends BaseSupportFragment implements RefreshScrollTopInterface, + SupportFragmentCallback, SystemWindowsInsetsCallback { + + private ViewPager mViewPager; + private TabPagerIndicator mPagerIndicator; + private View mPagerOverlay; + + private SupportTabsAdapter mPagerAdapter; + + @Override + public void onActivityCreated(final Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + final Bundle args = getArguments(); + final FragmentActivity activity = getActivity(); + mPagerAdapter = new SupportTabsAdapter(activity, getChildFragmentManager(), null, 1); + mViewPager.setAdapter(mPagerAdapter); + mViewPager.setOffscreenPageLimit(2); + mPagerIndicator.setViewPager(mViewPager); + mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL); + + mPagerAdapter.addTab(UserListsFragment.class, args, getString(R.string.follows), null, 0, null); + mPagerAdapter.addTab(UserListMembershipsFragment.class, args, getString(R.string.belongs_to), 0, 1, null); + + ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator, mPagerOverlay); + ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable()); + ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable()); + ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable()); + } + + + @Override + public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { + return inflater.inflate(R.layout.fragment_content_pages, container, false); + } + + @Override + public void onBaseViewCreated(final View view, final Bundle savedInstanceState) { + super.onBaseViewCreated(view, savedInstanceState); + mViewPager = (ViewPager) view.findViewById(R.id.view_pager); + mPagerIndicator = (TabPagerIndicator) view.findViewById(R.id.view_pager_tabs); + mPagerOverlay = view.findViewById(R.id.pager_window_overlay); + } + + @Override + public boolean scrollToStart() { + final Fragment fragment = getCurrentVisibleFragment(); + if (!(fragment instanceof RefreshScrollTopInterface)) return false; + ((RefreshScrollTopInterface) fragment).scrollToStart(); + return true; + } + + @Override + public boolean triggerRefresh() { + final Fragment fragment = getCurrentVisibleFragment(); + if (!(fragment instanceof RefreshScrollTopInterface)) return false; + ((RefreshScrollTopInterface) fragment).triggerRefresh(); + return true; + } + + @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; + } + + @Override + public boolean getSystemWindowsInsets(Rect insets) { + return false; + } +} diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java index 82832ed61..b8a531f3c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/MessagesConversationFragment.java @@ -25,7 +25,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; -import android.graphics.Rect; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; @@ -249,7 +248,7 @@ public class MessagesConversationFragment extends BaseSupportFragment implements if (actionBar == null) throw new NullPointerException(); actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_SHOW_CUSTOM); - actionBar.setCustomView(R.layout.actionbar_custom_view_message_user_picker); + actionBar.setCustomView(R.layout.layout_actionbar_message_user_picker); final View actionBarView = actionBar.getCustomView(); mAccountSpinner = (Spinner) actionBarView.findViewById(R.id.account_spinner); mEditUserQuery = (EditText) actionBarView.findViewById(R.id.user_query); diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java index 6b5a8939b..f5b3bf9a3 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserFragment.java @@ -81,6 +81,7 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import com.meizu.flyme.reflect.StatusBarProxy; import com.squareup.otto.Bus; import com.squareup.otto.Subscribe; @@ -213,6 +214,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener private int mActionBarShadowColor; private int mUiColor; private boolean mNameFirst; + private int mPreviousTabItemIsDark, mPreviousActionBarItemIsDark; private final LoaderCallbacks> mFriendshipLoaderCallbacks = new LoaderCallbacks>() { @@ -402,7 +404,7 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener @Override public boolean isScrollContent(float x, float y) { - final ViewPager v = mViewPager; + final View v = mViewPager; final int[] location = new int[2]; v.getLocationInWindow(location); return x >= location[0] && x <= location[0] + v.getWidth() @@ -892,6 +894,11 @@ public class UserFragment extends BaseSupportFragment implements OnClickListener intent.putExtras(extras); menu.removeGroup(MENU_GROUP_USER_EXTENSION); Utils.addIntentToMenu(getActivity(), menu, intent, MENU_GROUP_USER_EXTENSION); + final HeaderDrawerLayout drawer = mHeaderDrawerLayout; + if (drawer != null) { + final int offset = drawer.getPaddingTop() - drawer.getHeaderTop(); + updateScrollOffset(offset); + } } @Override @@ -1480,37 +1487,49 @@ 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 = TwidereColorUtils.getContrastYIQ(stackedTabColor, ThemeUtils.ACCENT_COLOR_THRESHOLD); - mPagerIndicator.setIconColor(contrastColor); - mPagerIndicator.setLabelColor(contrastColor); - mPagerIndicator.setStripColor(mUiColor); - } else if (drawable instanceof ColorDrawable) { - stackedTabColor = mUiColor; - final int tabColor = (Integer) sArgbEvaluator.evaluate(tabOutlineAlphaFactor, stackedTabColor, mCardBackgroundColor); - ((ColorDrawable) drawable).setColor(tabColor); - final int contrastColor = TwidereColorUtils.getContrastYIQ(tabColor, ThemeUtils.ACCENT_COLOR_THRESHOLD); - mPagerIndicator.setIconColor(contrastColor); - mPagerIndicator.setLabelColor(contrastColor); - mPagerIndicator.setStripColor(contrastColor); } else { - // This shouldn't happen, return - return; + stackedTabColor = mUiColor; } - final int barColor = (Integer) sArgbEvaluator.evaluate(factor, mActionBarShadowColor, stackedTabColor); - final int itemColor = ThemeUtils.getContrastActionBarItemColor(activity, themeId, barColor); - final Toolbar actionBarView = activity.getActionBarToolbar(); - if (actionBarView != null) { - actionBarView.setTitleTextColor(itemColor); - actionBarView.setSubtitleTextColor(itemColor); - ThemeUtils.setActionBarOverflowColor(actionBarView, itemColor); - ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor); - final Drawable navigationIcon = actionBarView.getNavigationIcon(); - if (navigationIcon != null) { - navigationIcon.setColorFilter(itemColor, Mode.SRC_ATOP); + + final int tabColor = (Integer) sArgbEvaluator.evaluate(tabOutlineAlphaFactor, stackedTabColor, mCardBackgroundColor); + ((ColorDrawable) drawable).setColor(tabColor); + final boolean tabItemIsDark = TwidereColorUtils.getYIQLuminance(tabColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD; + + if (mPreviousTabItemIsDark == 0 || (tabItemIsDark ? 1 : -1) != mPreviousTabItemIsDark) { + final int[] primaryColors = new int[2]; + ThemeUtils.getDarkLightForegroundColors(activity, themeId, primaryColors); + final int tabContrastColor = primaryColors[tabItemIsDark ? 0 : 1]; + mPagerIndicator.setIconColor(tabContrastColor); + mPagerIndicator.setLabelColor(tabContrastColor); + if (ThemeUtils.isDarkTheme(themeId)) { + mPagerIndicator.setStripColor(mUiColor); + } else { + mPagerIndicator.setStripColor(tabContrastColor); } - actionBarView.setNavigationIcon(navigationIcon); + mPagerIndicator.updateAppearance(); } - mPagerIndicator.updateAppearance(); + mPreviousTabItemIsDark = (tabItemIsDark ? 1 : -1); + + final int barColor = (Integer) sArgbEvaluator.evaluate(factor, mActionBarShadowColor, stackedTabColor); + final boolean actionItemIsDark = TwidereColorUtils.getYIQLuminance(barColor) > ThemeUtils.ACCENT_COLOR_THRESHOLD; + if (mPreviousActionBarItemIsDark == 0 || (actionItemIsDark ? 1 : -1) != mPreviousActionBarItemIsDark) { + StatusBarProxy.setStatusBarDarkIcon(activity.getWindow(), actionItemIsDark); + final int itemColor = ThemeUtils.getContrastActionBarItemColor(activity, themeId, barColor); + final int titleColor = ThemeUtils.getContrastActionBarTitleColor(activity, themeId, barColor); + final Toolbar actionBarView = activity.getActionBarToolbar(); + if (actionBarView != null) { + actionBarView.setTitleTextColor(titleColor); + actionBarView.setSubtitleTextColor(titleColor); + ThemeUtils.setActionBarOverflowColor(actionBarView, itemColor); + ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(actionBarView, ActionMenuView.class), itemColor, itemColor); + final Drawable navigationIcon = actionBarView.getNavigationIcon(); + if (navigationIcon != null) { + navigationIcon.setColorFilter(itemColor, Mode.SRC_ATOP); + } + actionBarView.setNavigationIcon(navigationIcon); + } + } + mPreviousActionBarItemIsDark = actionItemIsDark ? 1 : -1; } updateTitleAlpha(); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembershipsListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembershipsFragment.java similarity index 95% rename from twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembershipsListFragment.java rename to twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembershipsFragment.java index 7ddd2c102..e33ad5b19 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembershipsListFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListMembershipsFragment.java @@ -28,7 +28,7 @@ import org.mariotaku.twidere.model.ParcelableUserList; import java.util.List; -public class UserListMembershipsListFragment extends ParcelableUserListsFragment { +public class UserListMembershipsFragment extends ParcelableUserListsFragment { @Override public Loader> onCreateUserListsLoader(final Context context, diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsFragment.java index 6ff24775e..943731a5b 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsFragment.java @@ -1,115 +1,134 @@ /* - * Twidere - Twitter client for Android - * + * Twidere - Twitter client for Android + * * Copyright (C) 2012-2014 Mariotaku Lee - * + * * 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 . */ package org.mariotaku.twidere.fragment.support; -import android.graphics.Rect; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.view.ViewPager; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; +import android.support.v4.app.DialogFragment; +import android.support.v4.content.Loader; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import org.mariotaku.twidere.R; -import org.mariotaku.twidere.adapter.support.SupportTabsAdapter; -import org.mariotaku.twidere.fragment.iface.IBaseFragment.SystemWindowsInsetsCallback; -import org.mariotaku.twidere.fragment.iface.RefreshScrollTopInterface; -import org.mariotaku.twidere.fragment.iface.SupportFragmentCallback; -import org.mariotaku.twidere.graphic.EmptyDrawable; -import org.mariotaku.twidere.util.ThemeUtils; -import org.mariotaku.twidere.view.TabPagerIndicator; +import org.mariotaku.twidere.adapter.AbsUserListsAdapter; +import org.mariotaku.twidere.loader.support.UserListsLoader; +import org.mariotaku.twidere.model.ParcelableUserList; +import org.mariotaku.twidere.util.MenuUtils; +import org.mariotaku.twidere.util.Utils; -public class UserListsFragment extends BaseSupportFragment implements RefreshScrollTopInterface, - SupportFragmentCallback, SystemWindowsInsetsCallback { +import java.util.List; - private ViewPager mViewPager; - private TabPagerIndicator mPagerIndicator; - private View mPagerOverlay; +public class UserListsFragment extends ParcelableUserListsFragment { - private SupportTabsAdapter mPagerAdapter; + private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() { + + @Override + public void onReceive(final Context context, final Intent intent) { + if (getActivity() == null || !isAdded() || isDetached()) return; + final String action = intent.getAction(); + if (BROADCAST_USER_LIST_DELETED.equals(action)) { + final ParcelableUserList list = intent.getParcelableExtra(EXTRA_USER_LIST); + if (list != null) { + removeUserList(list.id); + } + } + } + }; + + @Override + public Loader> onCreateUserListsLoader(final Context context, + final Bundle args, final boolean fromUser) { + final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1); + final long userId = args.getLong(EXTRA_USER_ID, -1); + final String screenName = args.getString(EXTRA_SCREEN_NAME); + return new UserListsLoader(getActivity(), accountId, userId, screenName, true, getData()); + } @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - final Bundle args = getArguments(); - final FragmentActivity activity = getActivity(); - mPagerAdapter = new SupportTabsAdapter(activity, getChildFragmentManager(), null, 1); - mViewPager.setAdapter(mPagerAdapter); - mViewPager.setOffscreenPageLimit(2); - mPagerIndicator.setViewPager(mViewPager); - mPagerIndicator.setTabDisplayOption(TabPagerIndicator.LABEL); - - mPagerAdapter.addTab(UserListsListFragment.class, args, getString(R.string.follows), null, 0, null); - mPagerAdapter.addTab(UserListMembershipsListFragment.class, args, getString(R.string.belongs_to), 0, 1, null); - - ThemeUtils.initPagerIndicatorAsActionBarTab(activity, mPagerIndicator, mPagerOverlay); - ThemeUtils.setCompatToolbarOverlay(activity, new EmptyDrawable()); - ThemeUtils.setCompatContentViewOverlay(activity, new EmptyDrawable()); - ThemeUtils.setWindowOverlayViewOverlay(activity, new EmptyDrawable()); - } - - - @Override - public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_content_pages, container, false); + setHasOptionsMenu(true); } @Override - public void onBaseViewCreated(final View view, final Bundle savedInstanceState) { - super.onBaseViewCreated(view, savedInstanceState); - mViewPager = (ViewPager) view.findViewById(R.id.view_pager); - mPagerIndicator = (TabPagerIndicator) view.findViewById(R.id.view_pager_tabs); - mPagerOverlay = view.findViewById(R.id.pager_window_overlay); + public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { + inflater.inflate(R.menu.menu_user_lists_owned, menu); } @Override - public boolean scrollToStart() { - final Fragment fragment = getCurrentVisibleFragment(); - if (!(fragment instanceof RefreshScrollTopInterface)) return false; - ((RefreshScrollTopInterface) fragment).scrollToStart(); - return true; + public boolean onOptionsItemSelected(final MenuItem item) { + switch (item.getItemId()) { + case R.id.new_user_list: { + final DialogFragment f = new CreateUserListDialogFragment(); + final Bundle args = new Bundle(); + args.putLong(EXTRA_ACCOUNT_ID, getAccountId()); + f.setArguments(args); + f.show(getFragmentManager(), null); + return true; + } + } + return super.onOptionsItemSelected(item); } @Override - public boolean triggerRefresh() { - final Fragment fragment = getCurrentVisibleFragment(); - if (!(fragment instanceof RefreshScrollTopInterface)) return false; - ((RefreshScrollTopInterface) fragment).triggerRefresh(); - return true; + public void onPrepareOptionsMenu(final Menu menu) { + final MenuItem item = menu.findItem(R.id.new_user_list); + if (item == null) return; + final long accountId = getAccountId(), userId = getUserId(); + if (accountId == userId) { + MenuUtils.setMenuItemAvailability(menu, R.id.new_user_list, true); + } else { + MenuUtils.setMenuItemAvailability(menu, R.id.new_user_list, Utils.isMyAccount(getActivity(), getScreenName())); + } + } + + private String getScreenName() { + return getArguments().getString(EXTRA_SCREEN_NAME); + } + + private long getUserId() { + return getArguments().getLong(EXTRA_USER_ID); } @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 onStart() { + super.onStart(); + registerReceiver(mStatusReceiver, new IntentFilter(BROADCAST_USER_LIST_DELETED)); } @Override - public boolean triggerRefresh(final int position) { - return false; + public void onStop() { + unregisterReceiver(mStatusReceiver); + super.onStop(); } - @Override - public boolean getSystemWindowsInsets(Rect insets) { - return false; + private void removeUserList(final long id) { + final AbsUserListsAdapter> adapter = getAdapter(); +// final int listsIdx = adapter.findItemPosition(id); +// if (listsIdx >= 0) { +// adapter.removeAt(listsIdx); +// } } + } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsListFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsListFragment.java deleted file mode 100644 index 1e4ee0a0d..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserListsListFragment.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.fragment.support; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.support.v4.content.Loader; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.adapter.AbsUserListsAdapter; -import org.mariotaku.twidere.loader.support.UserListsLoader; -import org.mariotaku.twidere.model.ParcelableUserList; - -import java.util.List; - -public class UserListsListFragment extends ParcelableUserListsFragment { - - private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() { - - @Override - public void onReceive(final Context context, final Intent intent) { - if (getActivity() == null || !isAdded() || isDetached()) return; - final String action = intent.getAction(); - if (BROADCAST_USER_LIST_DELETED.equals(action)) { - final ParcelableUserList list = intent.getParcelableExtra(EXTRA_USER_LIST); - if (list != null) { - removeUserList(list.id); - } - } - } - }; - - @Override - public Loader> onCreateUserListsLoader(final Context context, - final Bundle args, final boolean fromUser) { - final long accountId = args.getLong(EXTRA_ACCOUNT_ID, -1); - final long userId = args.getLong(EXTRA_USER_ID, -1); - final String screenName = args.getString(EXTRA_SCREEN_NAME); - return new UserListsLoader(getActivity(), accountId, userId, screenName, true, getData()); - } - - @Override - public void onActivityCreated(final Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - setHasOptionsMenu(true); - } - - @Override - public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { - inflater.inflate(R.menu.menu_user_lists_owned, menu); - } - - @Override - public boolean onOptionsItemSelected(final MenuItem item) { - switch (item.getItemId()) { - case R.id.new_user_list: { - final DialogFragment f = new CreateUserListDialogFragment(); - final Bundle args = new Bundle(); - args.putLong(EXTRA_ACCOUNT_ID, getAccountId()); - f.setArguments(args); - f.show(getFragmentManager(), null); - return true; - } - } - return super.onOptionsItemSelected(item); - } - - @Override - public void onPrepareOptionsMenu(final Menu menu) { -// final MenuItem item = menu.findItem(R.id.new_user_list); -// if (item == null) return; -// final long account_id = getAccountId(), user_id = getUserId(); -// final String screen_name = getAccountScreenName(getActivity(), account_id); -// item.setVisible(user_id == account_id || screen_name != null && screen_name.equalsIgnoreCase(getScreenName())); - } - - public void onPullUpToRefresh() { - } - - @Override - public void onStart() { - super.onStart(); - registerReceiver(mStatusReceiver, new IntentFilter(BROADCAST_USER_LIST_DELETED)); - } - - @Override - public void onStop() { - unregisterReceiver(mStatusReceiver); - super.onStop(); - } - - private void removeUserList(final long id) { - final AbsUserListsAdapter> adapter = getAdapter(); -// final int listsIdx = adapter.findItemPosition(id); -// if (listsIdx >= 0) { -// adapter.removeAt(listsIdx); -// } - } - -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java index b2a4f2c68..b22e603ae 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/UserProfileEditorFragment.java @@ -273,7 +273,7 @@ public class UserProfileEditorFragment extends BaseSupportFragment implements On @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - return inflater.inflate(R.layout.activity_user_profile_editor, container, false); + return inflater.inflate(R.layout.fragment_user_profile_editor, container, false); } @Override diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java index 5b39bc872..7f2ee4802 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/Twitter4JActivitiesLoader.java @@ -22,14 +22,12 @@ package org.mariotaku.twidere.loader.support; import android.content.Context; import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; -import android.os.Handler; import android.util.Log; import android.util.Pair; import com.bluelinelabs.logansquare.LoganSquare; import org.mariotaku.jsonserializer.JSONFileIO; -import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.model.ParcelableActivity; import org.mariotaku.twidere.util.Utils; @@ -56,8 +54,6 @@ public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoad private final Context mContext; private final long mAccountIds; private final long mMaxId, mSinceId; - private final SQLiteDatabase mDatabase; - private final Handler mHandler; private final Object[] mSavedStatusesFileArgs; private Comparator mComparator; @@ -69,8 +65,6 @@ public abstract class Twitter4JActivitiesLoader extends ParcelableActivitiesLoad mAccountIds = accountId; mSinceId = sinceId; mMaxId = maxId; - mDatabase = TwidereApplication.getInstance(context).getSQLiteDatabase(); - mHandler = new Handler(); mSavedStatusesFileArgs = savedStatusesArgs; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java index cd7f4bee0..8021d7f3c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/loader/support/TwitterAPIStatusesLoader.java @@ -56,7 +56,6 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader private final Context mContext; private final long mAccountId; private final long mMaxId, mSinceId; - private final SQLiteDatabase mDatabase; private final Object[] mSavedStatusesFileArgs; private Comparator mComparator; @@ -68,7 +67,6 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader mAccountId = accountId; mMaxId = maxId; mSinceId = sinceId; - mDatabase = TwidereApplication.getInstance(context).getSQLiteDatabase(); mSavedStatusesFileArgs = savedStatusesArgs; } @@ -143,10 +141,11 @@ public abstract class TwitterAPIStatusesLoader extends ParcelableStatusesLoader data.add(new ParcelableStatus(status, mAccountId, insertGap && isGapEnabled() && minIdx == i)); } + final SQLiteDatabase db = TwidereApplication.getInstance(context).getSQLiteDatabase(); final ParcelableStatus[] array = data.toArray(new ParcelableStatus[data.size()]); for (int i = 0, size = array.length; i < size; i++) { final ParcelableStatus status = array[i]; - if (shouldFilterStatus(mDatabase, status) && !status.is_gap && i != size - 1) { + if (shouldFilterStatus(db, status) && !status.is_gap && i != size - 1) { deleteStatus(data, status.id); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/SimpleDrawerCallback.java b/twidere/src/main/java/org/mariotaku/twidere/util/SimpleDrawerCallback.java index c810cb7d1..99211d32c 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/SimpleDrawerCallback.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/SimpleDrawerCallback.java @@ -20,8 +20,10 @@ package org.mariotaku.twidere.util; import android.os.SystemClock; +import android.support.v4.view.ViewPager; import android.support.v7.widget.RecyclerView; import android.view.MotionEvent; +import android.view.View; import org.mariotaku.twidere.view.HeaderDrawerLayout.DrawerCallback; @@ -54,9 +56,11 @@ public class SimpleDrawerCallback implements DrawerCallback { @Override public boolean isScrollContent(float x, float y) { + final View v = mRecyclerView; final int[] location = new int[2]; - mRecyclerView.getLocationOnScreen(location); - return x >= location[0] && x <= location[0] && y >= location[1] && y <= location[1]; + v.getLocationInWindow(location); + return x >= location[0] && x <= location[0] + v.getWidth() + && y >= location[1] && y <= location[1] + v.getHeight(); } @Override diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/StrictModeUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/StrictModeUtils.java index cc897175e..229f4f398 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/StrictModeUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/StrictModeUtils.java @@ -28,54 +28,54 @@ import java.util.Locale; public class StrictModeUtils { - public static final String LOGTAG = "Twidere.StrictMode"; - public static final String CLASS_NAME = StrictModeUtils.class.getName(); + public static final String LOGTAG = "Twidere.StrictMode"; + public static final String CLASS_NAME = StrictModeUtils.class.getName(); - public static void checkDiskIO() { - check("Disk IO"); - } + public static void checkDiskIO() { + check("Disk IO"); + } - public static void checkLengthyOperation() { - check("Lengthy operation"); - } + public static void checkLengthyOperation() { + check("Lengthy operation"); + } - public static void detectAllThreadPolicy() { - final ThreadPolicy.Builder threadPolicyBuilder = new ThreadPolicy.Builder(); - threadPolicyBuilder.detectAll(); - threadPolicyBuilder.penaltyLog(); - StrictMode.setThreadPolicy(threadPolicyBuilder.build()); - } + public static void detectAllThreadPolicy() { + final ThreadPolicy.Builder threadPolicyBuilder = new ThreadPolicy.Builder(); + threadPolicyBuilder.detectAll(); + threadPolicyBuilder.penaltyLog(); + StrictMode.setThreadPolicy(threadPolicyBuilder.build()); + } - public static void detectAllVmPolicy() { - final VmPolicy.Builder vmPolicyBuilder = new VmPolicy.Builder(); - vmPolicyBuilder.detectAll(); - vmPolicyBuilder.penaltyLog(); - StrictMode.setVmPolicy(vmPolicyBuilder.build()); - } + public static void detectAllVmPolicy() { + final VmPolicy.Builder vmPolicyBuilder = new VmPolicy.Builder(); + vmPolicyBuilder.detectAll(); + vmPolicyBuilder.penaltyLog(); + StrictMode.setVmPolicy(vmPolicyBuilder.build()); + } - private static void check(final String message) { - final Thread thread = Thread.currentThread(); - if (thread == null || thread.getId() != 1) return; - final StackTraceElement[] framesArray = thread.getStackTrace(); + private static void check(final String message) { + final Thread thread = Thread.currentThread(); + if (thread.getId() != 1) return; + final StackTraceElement[] framesArray = thread.getStackTrace(); - // look for the last stack frame from this class and then whatever is - // next is the caller we want to know about - int logCounter = -1; - for (final StackTraceElement stackFrame : framesArray) { - final String className = stackFrame.getClassName(); - if (logCounter >= 0 && logCounter < 3) { - final String file = stackFrame.getFileName(), method = stackFrame.getMethodName(); - final int line = stackFrame.getLineNumber(); - final String nonEmptyFile = file != null ? file : "Unknown"; - if (logCounter == 0) { - Log.w(LOGTAG, String.format(Locale.US, "%s on main thread:\n", message)); - } - Log.w(LOGTAG, String.format(Locale.US, "\t at %s.%s(%s:%d)", className, method, nonEmptyFile, line)); - if (++logCounter == 3) return; - } else if (CLASS_NAME.equals(className) && logCounter == -1) { - logCounter = 0; - } - } - } + // look for the last stack frame from this class and then whatever is + // next is the caller we want to know about + int logCounter = -1; + for (final StackTraceElement stackFrame : framesArray) { + final String className = stackFrame.getClassName(); + if (logCounter >= 0 && logCounter < 3) { + final String file = stackFrame.getFileName(), method = stackFrame.getMethodName(); + final int line = stackFrame.getLineNumber(); + final String nonEmptyFile = file != null ? file : "Unknown"; + if (logCounter == 0) { + Log.w(LOGTAG, String.format(Locale.US, "%s on main thread:\n", message)); + } + Log.w(LOGTAG, String.format(Locale.US, "\t at %s.%s(%s:%d)", className, method, nonEmptyFile, line)); + if (++logCounter == 3) return; + } else if (CLASS_NAME.equals(className) && logCounter == -1) { + logCounter = 0; + } + } + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java index e5af7a8d9..4a282068d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ThemeUtils.java @@ -38,6 +38,7 @@ import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewCompat; import android.support.v7.app.AppCompatDelegate; import android.support.v7.app.AppCompatDelegateTrojan; +import android.support.v7.internal.app.ToolbarActionBar; import android.support.v7.internal.app.WindowDecorActionBar; import android.support.v7.internal.app.WindowDecorActionBar.ActionModeImpl; import android.support.v7.internal.view.StandaloneActionMode; @@ -79,6 +80,7 @@ import org.mariotaku.twidere.text.ParagraphSpacingSpan; import org.mariotaku.twidere.util.menu.TwidereMenuInfo; import org.mariotaku.twidere.util.support.ViewSupport; import org.mariotaku.twidere.view.TabPagerIndicator; +import org.mariotaku.twidere.view.TwidereToolbar; import java.lang.reflect.Field; @@ -448,7 +450,7 @@ public class ThemeUtils implements Constants { } public static int getContrastActionBarItemColor(Context context, int theme, int color) { - if (isDarkTheme(theme) || TwidereColorUtils.getYIQLuminance(color) < ACCENT_COLOR_THRESHOLD) { + if (isDarkTheme(theme) || TwidereColorUtils.getYIQLuminance(color) <= ACCENT_COLOR_THRESHOLD) { //return light text color return context.getResources().getColor(R.color.action_icon_light); } @@ -459,13 +461,13 @@ public class ThemeUtils implements Constants { public static int getContrastActionBarTitleColor(Context context, int theme, int color) { if (isDarkTheme(theme)) { //return light text color - return getTextColorPrimary(context); - } else if (TwidereColorUtils.getYIQLuminance(color) < ACCENT_COLOR_THRESHOLD) { + return getColorFromAttribute(context, android.R.attr.colorForeground, Color.RED); + } else if (TwidereColorUtils.getYIQLuminance(color) <= ACCENT_COLOR_THRESHOLD) { //return light text color - return getTextColorPrimaryInverse(context); + return getColorFromAttribute(context, android.R.attr.colorForegroundInverse, Color.RED); } else { //return dark text color - return getTextColorPrimary(context); + return getColorFromAttribute(context, android.R.attr.colorForeground, Color.RED); } } @@ -522,7 +524,7 @@ public class ThemeUtils implements Constants { TwidereColorUtils.colorToYIQ(color, yiq); final int y = yiq[0]; TwidereColorUtils.colorToYIQ(linkColor, yiq); - if (y < 32 && yiq[0] < ACCENT_COLOR_THRESHOLD) { + if (y < 32 && yiq[0] <= ACCENT_COLOR_THRESHOLD) { return linkColor; } else if (y > ACCENT_COLOR_THRESHOLD && yiq[0] > 32) { return linkColor; @@ -574,6 +576,15 @@ public class ThemeUtils implements Constants { } } + public static int getColorFromAttribute(Context context, int attr, int def) { + final TypedValue outValue = new TypedValue(); + if (!context.getTheme().resolveAttribute(attr, outValue, true)) + return def; + if (outValue.type == TypedValue.TYPE_REFERENCE) + return context.getResources().getColor(attr); + return outValue.data; + } + public static int getTextAppearanceLarge(final Context context) { // final Context wrapped = getThemedContext(context, // getResources(context)); @@ -1037,6 +1048,8 @@ public class ThemeUtils implements Constants { actionBar.setSubtitle(actionBar.getSubtitle()); setActionBarTitleTextColor(window, titleColor); setActionBarSubtitleTextColor(window, titleColor); + } else if (actionBar instanceof ToolbarActionBar) { + } } @@ -1046,13 +1059,15 @@ public class ThemeUtils implements Constants { drawable.setColorFilter(itemColor, Mode.SRC_ATOP); } toolbar.setNavigationIcon(drawable); - // Ensure title view created toolbar.setTitleTextColor(titleColor); toolbar.setSubtitleTextColor(titleColor); } public static void setActionBarOverflowColor(Toolbar toolbar, int itemColor) { if (toolbar == null) return; + if (toolbar instanceof TwidereToolbar) { + ((TwidereToolbar) toolbar).setItemColor(itemColor); + } final ActionMenuView actionMenuView = ViewSupport.findViewByType(toolbar, ActionMenuView.class); if (actionMenuView == null) return; View overflowView = null; @@ -1068,6 +1083,21 @@ public class ThemeUtils implements Constants { ((ImageView) overflowView).setColorFilter(itemColor, Mode.SRC_ATOP); } + public static void setActionBarMenuItemsColor(Toolbar toolbar, int itemColor) { + if (toolbar == null) return; + if (toolbar instanceof TwidereToolbar) { + ((TwidereToolbar) toolbar).setItemColor(itemColor); + } + final ActionMenuView actionMenuView = ViewSupport.findViewByType(toolbar, ActionMenuView.class); + if (actionMenuView == null) return; + for (int i = 0, j = actionMenuView.getChildCount(); i < j; i++) { + final View child = actionMenuView.getChildAt(i); + if (child instanceof ActionMenuView.ActionMenuChildView && child instanceof ImageView) { + ((ImageView) child).setColorFilter(itemColor, Mode.SRC_ATOP); + } + } + } + public static void setActionBarOverflowColor(ActionMenuPresenter presenter, int itemColor) { if (presenter == null) return; final View view = (View) Utils.findFieldOfTypes(presenter, ActionMenuPresenter.class, @@ -1100,10 +1130,10 @@ public class ThemeUtils implements Constants { } } - public static void setActionBarTitleTextColor(Window window, int itemColor) { + public static void setActionBarTitleTextColor(Window window, int titleColor) { final View actionBarView = window.findViewById(android.support.v7.appcompat.R.id.action_bar); if (actionBarView instanceof Toolbar) { - ((Toolbar) actionBarView).setTitleTextColor(itemColor); + ((Toolbar) actionBarView).setTitleTextColor(titleColor); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java b/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java index 328609374..89f8ec14e 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/ThemedLayoutInflaterFactory.java @@ -40,11 +40,13 @@ import android.view.InflateException; import android.view.View; import android.widget.Button; import android.widget.EditText; +import android.widget.ProgressBar; import android.widget.TextView; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.AppCompatPreferenceActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity; +import org.mariotaku.twidere.util.support.ViewSupport; import org.mariotaku.twidere.view.ShapedImageView; import org.mariotaku.twidere.view.TwidereToolbar; import org.mariotaku.twidere.view.iface.IThemeAccentView; @@ -130,10 +132,12 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory { final boolean isActionBarContext = isActionBarContext(view.getContext(), getActionBarContext((Activity) activity)); final int themeResourceId = activity.getCurrentThemeResourceId(); final boolean isDarkTheme = ThemeUtils.isDarkTheme(themeResourceId); + final int backgroundColorApprox; if (!isActionBarContext) { accentColor = actionBarColor = activity.getCurrentThemeColor(); noTintColor = TwidereColorUtils.getContrastYIQ(accentColor, ThemeUtils.ACCENT_COLOR_THRESHOLD); backgroundTintColor = accentColor; + backgroundColorApprox = isDarkTheme ? Color.BLACK : Color.WHITE; isColorTint = true; } else if (isDarkTheme) { // View context is derived from ActionBar but is currently dark theme, so we should show @@ -142,6 +146,7 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory { noTintColor = Color.WHITE; accentColor = activity.getCurrentThemeColor(); backgroundTintColor = noTintColor; + backgroundColorApprox = Color.BLACK; isColorTint = true; } else { // View context is derived from ActionBar and it's light theme, so we use contrast color @@ -149,14 +154,20 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory { accentColor = TwidereColorUtils.getContrastYIQ(actionBarColor, ThemeUtils.ACCENT_COLOR_THRESHOLD); noTintColor = TwidereColorUtils.getContrastYIQ(accentColor, ThemeUtils.ACCENT_COLOR_THRESHOLD); backgroundTintColor = accentColor; + backgroundColorApprox = Color.WHITE; isColorTint = false; } if (view instanceof TextView) { final TextView textView = (TextView) view; - textView.setLinkTextColor(accentColor); + + if (Math.abs(TwidereColorUtils.getYIQContrast(backgroundColorApprox, accentColor)) > 64) { + textView.setLinkTextColor(accentColor); + } } if (view instanceof IThemeAccentView) { - ((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(accentColor)); + if (Math.abs(TwidereColorUtils.getYIQContrast(backgroundColorApprox, accentColor)) > 64) { + ((IThemeAccentView) view).setAccentTintColor(ColorStateList.valueOf(accentColor)); + } } else if (view instanceof IThemeBackgroundTintView) { ((IThemeBackgroundTintView) view).setBackgroundTintColor(ColorStateList.valueOf(backgroundTintColor)); } else if (view instanceof TintableBackgroundView) { @@ -168,6 +179,9 @@ public class ThemedLayoutInflaterFactory implements LayoutInflaterFactory { ((TwidereToolbar) view).setItemColor(itemColor); } else if (view instanceof EditText) { ViewCompat.setBackgroundTintList(view, ColorStateList.valueOf(accentColor)); + } else if (view instanceof ProgressBar) { + ViewSupport.setProgressTintList((ProgressBar) view, ColorStateList.valueOf(accentColor)); + ViewSupport.setProgressBackgroundTintList((ProgressBar) view, ColorStateList.valueOf(accentColor)); } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereColorUtils.java b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereColorUtils.java index b6789def4..3e5e894ba 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/TwidereColorUtils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/TwidereColorUtils.java @@ -123,4 +123,8 @@ public class TwidereColorUtils { final int yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000; return (yiq >= threshold) ? colorDark : colorLight; } + + public static int getYIQContrast(int color1, int color2) { + return getYIQLuminance(color1) - getYIQLuminance(color2); + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java index 919087d50..d1b6e3459 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/Utils.java @@ -144,6 +144,7 @@ import org.mariotaku.twidere.fragment.support.DestroyStatusDialogFragment; import org.mariotaku.twidere.fragment.support.DraftsFragment; import org.mariotaku.twidere.fragment.support.FiltersFragment; import org.mariotaku.twidere.fragment.support.IncomingFriendshipsFragment; +import org.mariotaku.twidere.fragment.support.ListsFragment; import org.mariotaku.twidere.fragment.support.MessagesConversationFragment; import org.mariotaku.twidere.fragment.support.MutesUsersListFragment; import org.mariotaku.twidere.fragment.support.SavedSearchesListFragment; @@ -163,10 +164,9 @@ import org.mariotaku.twidere.fragment.support.UserFragment; import org.mariotaku.twidere.fragment.support.UserFriendsFragment; import org.mariotaku.twidere.fragment.support.UserListFragment; import org.mariotaku.twidere.fragment.support.UserListMembersFragment; -import org.mariotaku.twidere.fragment.support.UserListMembershipsListFragment; +import org.mariotaku.twidere.fragment.support.UserListMembershipsFragment; import org.mariotaku.twidere.fragment.support.UserListSubscribersFragment; import org.mariotaku.twidere.fragment.support.UserListTimelineFragment; -import org.mariotaku.twidere.fragment.support.UserListsFragment; import org.mariotaku.twidere.fragment.support.UserMediaTimelineFragment; import org.mariotaku.twidere.fragment.support.UserMentionsFragment; import org.mariotaku.twidere.fragment.support.UserProfileEditorFragment; @@ -812,7 +812,7 @@ public final class Utils implements Constants, TwitterConstants { break; } case LINK_ID_USER_LIST_MEMBERSHIPS: { - fragment = new UserListMembershipsListFragment(); + fragment = new UserListMembershipsFragment(); final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME); final String paramUserId = uri.getQueryParameter(QUERY_PARAM_USER_ID); if (!args.containsKey(EXTRA_SCREEN_NAME)) { @@ -925,7 +925,7 @@ public final class Utils implements Constants, TwitterConstants { break; } case LINK_ID_USER_LISTS: { - fragment = new UserListsFragment(); + fragment = new ListsFragment(); final String paramScreenName = uri.getQueryParameter(QUERY_PARAM_SCREEN_NAME); final String paramUserId = uri.getQueryParameter(QUERY_PARAM_USER_ID); if (!args.containsKey(EXTRA_SCREEN_NAME)) { diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/ShapedImageView.java b/twidere/src/main/java/org/mariotaku/twidere/view/ShapedImageView.java index e3ac6ca12..f56f68def 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/ShapedImageView.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/ShapedImageView.java @@ -67,7 +67,6 @@ public class ShapedImageView extends ImageView { @ShapeStyle public static final int SHAPE_RECTANGLE = 0x2; private static final int SHADOW_START_COLOR = 0x37000000; - private static final boolean USE_OUTLINE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; private static final boolean OUTLINE_DRAW = false; private final Matrix mMatrix; private final RectF mSource; @@ -128,7 +127,7 @@ public class ShapedImageView extends ImageView { setCornerRadius(a.getDimension(R.styleable.ShapedImageView_sivCornerRadius, 0)); setCornerRadiusRatio(a.getFraction(R.styleable.ShapedImageView_sivCornerRadiusRatio, 1, 1, -1)); - if (USE_OUTLINE) { + if (useOutline()) { if (a.hasValue(R.styleable.ShapedImageView_sivElevation)) { ViewCompat.setElevation(this, a.getDimensionPixelSize(R.styleable.ShapedImageView_sivElevation, 0)); @@ -139,9 +138,7 @@ public class ShapedImageView extends ImageView { setBackgroundColor(a.getColor(R.styleable.ShapedImageView_sivBackgroundColor, 0)); a.recycle(); - if (USE_OUTLINE) { - initOutlineProvider(); - } + initOutlineProvider(); } /** @@ -426,6 +423,7 @@ public class ShapedImageView extends ImageView { } private void initOutlineProvider() { + if (!useOutline()) return; ViewSupport.setClipToOutline(this, true); ViewSupport.setOutlineProvider(this, new CircularOutlineProvider()); } @@ -466,7 +464,7 @@ public class ShapedImageView extends ImageView { } private void updateShadowBitmap() { - if (USE_OUTLINE) return; + if (useOutline()) return; final int width = getWidth(), height = getHeight(); if (width <= 0 || height <= 0) return; final int contentLeft = getPaddingLeft(), contentTop = getPaddingTop(), @@ -497,6 +495,10 @@ public class ShapedImageView extends ImageView { invalidate(); } + private boolean useOutline() { + return Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP && !isInEditMode(); + } + @IntDef({SHAPE_CIRCLE, SHAPE_RECTANGLE}) @Retention(RetentionPolicy.SOURCE) public @interface ShapeStyle { @@ -505,9 +507,10 @@ public class ShapedImageView extends ImageView { private static class CircularOutlineProvider extends ViewOutlineProviderCompat { @Override public void getOutline(View view, OutlineCompat outline) { + final int viewWidth = view.getWidth(), viewHeight = view.getHeight(); final int contentLeft = view.getPaddingLeft(), contentTop = view.getPaddingTop(), - contentRight = view.getWidth() - view.getPaddingRight(), - contentBottom = view.getHeight() - view.getPaddingBottom(); + contentRight = viewWidth - view.getPaddingRight(), + contentBottom = viewHeight - view.getPaddingBottom(); final ShapedImageView imageView = (ShapedImageView) view; if (imageView.getStyle() == SHAPE_CIRCLE) { final int contentWidth = contentRight - contentLeft, diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/TintedStatusRelativeLayout.java b/twidere/src/main/java/org/mariotaku/twidere/view/TintedStatusRelativeLayout.java deleted file mode 100644 index 676573c9e..000000000 --- a/twidere/src/main/java/org/mariotaku/twidere/view/TintedStatusRelativeLayout.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Twidere - Twitter client for Android - * - * Copyright (C) 2012-2014 Mariotaku Lee - * - * 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 . - */ - -package org.mariotaku.twidere.view; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Rect; -import android.support.annotation.NonNull; -import android.util.AttributeSet; - -import org.mariotaku.twidere.R; -import org.mariotaku.twidere.util.MathUtils; -import org.mariotaku.twidere.util.Utils; -import org.mariotaku.twidere.view.iface.TintedStatusLayout; - -/** - * Created by mariotaku on 14/11/26. - */ -public class TintedStatusRelativeLayout extends ExtendedRelativeLayout implements TintedStatusLayout { - - private final Paint mBlackPaint, mShadowPaint, mColorPaint; - private boolean mSetPadding; - - private int mStatusBarHeight; - private float mFactor; - private int mColorAlpha, mShadowAlpha; - private boolean mDrawShadow, mDrawColor; - private Rect mSystemWindowsInsets; - - public TintedStatusRelativeLayout(Context context) { - this(context, null); - } - - public TintedStatusRelativeLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public TintedStatusRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TintedStatusLayout); - setSetPaddingEnabled(a.getBoolean(R.styleable.TintedStatusLayout_setPadding, false)); - a.recycle(); - mBlackPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mBlackPaint.setColor(Color.BLACK); - mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mSystemWindowsInsets = new Rect(); - setWillNotDraw(false); - setFactor(1); - } - - - @Override - public void setColor(int color) { - setColor(color, Color.alpha(color)); - } - - @Override - public void setColor(int color, int alpha) { - mColorPaint.setColor(color); - mColorAlpha = alpha; - updateAlpha(); - } - - @Override - public void setDrawColor(boolean color) { - mDrawColor = color; - invalidate(); - } - - @Override - public void setDrawShadow(boolean shadow) { - mDrawShadow = shadow; - invalidate(); - } - - @Override - public void setFactor(float f) { - mFactor = f; - updateAlpha(); - } - - @Override - public void setShadowColor(int color) { - mShadowPaint.setColor(color); - mShadowAlpha = Color.alpha(color); - updateAlpha(); - } - - @Override - public void setSetPaddingEnabled(boolean enabled) { - mSetPadding = enabled; - } - - public void setStatusBarHeight(int height) { - mStatusBarHeight = height; - invalidate(); - } - - @Override - public void getSystemWindowsInsets(Rect insets) { - insets.set(mSystemWindowsInsets); - } - - @Override - protected void dispatchDraw(@NonNull Canvas canvas) { - super.dispatchDraw(canvas); - if (mDrawShadow) { - canvas.drawRect(0, 0, canvas.getWidth(), mStatusBarHeight, mShadowPaint); - } else if (mDrawColor) { - canvas.drawRect(0, 0, canvas.getWidth(), mStatusBarHeight, mBlackPaint); - } - canvas.drawRect(0, 0, canvas.getWidth(), mStatusBarHeight, mDrawColor ? mColorPaint : mBlackPaint); - } - - @Override - protected boolean fitSystemWindows(@NonNull Rect insets) { - setStatusBarHeight(Utils.getInsetsTopWithoutActionBarHeight(getContext(), insets.top)); - if (mSetPadding) { - setPadding(insets.left, insets.top, insets.right, insets.bottom); - } - mSystemWindowsInsets.set(insets); - return super.fitSystemWindows(insets); - } - - private void updateAlpha() { - final float f = mFactor; - mShadowPaint.setAlpha(Math.round(mShadowAlpha * MathUtils.clamp(1 - f, 0, 1))); - mColorPaint.setAlpha(Math.round(0xFF * MathUtils.clamp(f, 0, 1))); - invalidate(); - } -} diff --git a/twidere/src/main/java/org/mariotaku/twidere/view/themed/ThemedAccentMaterialEditText.java b/twidere/src/main/java/org/mariotaku/twidere/view/themed/ThemedBackgroundTIntMaterialEditText.java similarity index 71% rename from twidere/src/main/java/org/mariotaku/twidere/view/themed/ThemedAccentMaterialEditText.java rename to twidere/src/main/java/org/mariotaku/twidere/view/themed/ThemedBackgroundTIntMaterialEditText.java index eed6936a3..8b14881b5 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/view/themed/ThemedAccentMaterialEditText.java +++ b/twidere/src/main/java/org/mariotaku/twidere/view/themed/ThemedBackgroundTIntMaterialEditText.java @@ -26,26 +26,27 @@ import android.util.AttributeSet; import com.rengwuxian.materialedittext.MaterialEditText; -import org.mariotaku.twidere.view.iface.IThemeAccentView; +import org.mariotaku.twidere.view.iface.IThemeBackgroundTintView; /** * Created by mariotaku on 15/4/29. */ -public class ThemedAccentMaterialEditText extends MaterialEditText implements IThemeAccentView { - public ThemedAccentMaterialEditText(Context context) { +public class ThemedBackgroundTintMaterialEditText extends MaterialEditText implements IThemeBackgroundTintView { + public ThemedBackgroundTintMaterialEditText(Context context) { super(context); } - public ThemedAccentMaterialEditText(Context context, AttributeSet attrs) { + public ThemedBackgroundTintMaterialEditText(Context context, AttributeSet attrs) { super(context, attrs); } - public ThemedAccentMaterialEditText(Context context, AttributeSet attrs, int style) { + public ThemedBackgroundTintMaterialEditText(Context context, AttributeSet attrs, int style) { super(context, attrs, style); } @Override - public void setAccentTintColor(@NonNull ColorStateList color) { + public void setBackgroundTintColor(@NonNull ColorStateList color) { setPrimaryColor(color.getDefaultColor()); } + } diff --git a/twidere/src/main/res/layout/activity_accounts_manager.xml b/twidere/src/main/res/layout/activity_accounts_manager.xml deleted file mode 100644 index f39d53598..000000000 --- a/twidere/src/main/res/layout/activity_accounts_manager.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - diff --git a/twidere/src/main/res/layout/activity_compose.xml b/twidere/src/main/res/layout/activity_compose.xml index ab97f5eed..d9c5755ea 100644 --- a/twidere/src/main/res/layout/activity_compose.xml +++ b/twidere/src/main/res/layout/activity_compose.xml @@ -1,5 +1,4 @@ - - - - - - - - diff --git a/twidere/src/main/res/layout/adapter_item_compose_account.xml b/twidere/src/main/res/layout/adapter_item_compose_account.xml index d27a6cc36..ae9c9a030 100644 --- a/twidere/src/main/res/layout/adapter_item_compose_account.xml +++ b/twidere/src/main/res/layout/adapter_item_compose_account.xml @@ -27,20 +27,31 @@ + app:sivBorderWidth="@dimen/line_width_compose_account_profile_image" + app:sivElevation="@dimen/elevation_card" /> - + android:layout_marginLeft="@dimen/element_spacing_msmall" + app:cardBackgroundColor="?android:colorBackgroundCacheHint" + app:cardElevation="@dimen/elevation_card" + app:contentPadding="@dimen/element_spacing_small"> + + + \ No newline at end of file diff --git a/twidere/src/main/res/layout/dialog_user_list_detail_editor.xml b/twidere/src/main/res/layout/dialog_user_list_detail_editor.xml index 35fe2a493..49beb79b5 100644 --- a/twidere/src/main/res/layout/dialog_user_list_detail_editor.xml +++ b/twidere/src/main/res/layout/dialog_user_list_detail_editor.xml @@ -23,7 +23,7 @@ android:layout_height="match_parent" android:padding="8dp"> - - - - - - - - - - - \ No newline at end of file diff --git a/twidere/src/main/res/layout/activity_user_profile_editor.xml b/twidere/src/main/res/layout/fragment_user_profile_editor.xml similarity index 94% rename from twidere/src/main/res/layout/activity_user_profile_editor.xml rename to twidere/src/main/res/layout/fragment_user_profile_editor.xml index bea8b367e..9ff46c4f2 100644 --- a/twidere/src/main/res/layout/activity_user_profile_editor.xml +++ b/twidere/src/main/res/layout/fragment_user_profile_editor.xml @@ -93,6 +93,7 @@ android:id="@+id/profile_image_camera" style="?android:borderlessButtonStyle" android:layout_width="0dp" + android:background="?selectableItemBackground" android:layout_height="wrap_content" android:layout_weight="1" android:drawableLeft="@drawable/ic_action_camera" @@ -106,6 +107,7 @@ android:id="@+id/profile_image_gallery" style="?android:borderlessButtonStyle" android:layout_width="0dp" + android:background="?selectableItemBackground" android:layout_height="wrap_content" android:layout_weight="1" android:drawableLeft="@drawable/ic_action_gallery" @@ -148,7 +150,7 @@ android:paddingTop="@dimen/element_spacing_normal" android:text="@string/profile_banner" android:textAllCaps="true" - android:textAppearance="?android:attr/textAppearanceSmall" + android:textAppearance="?android:textAppearanceSmall" android:textColor="?android:textColorPrimary" android:textStyle="bold" /> @@ -167,6 +169,7 @@ android:drawableLeft="@drawable/ic_action_gallery" android:paddingBottom="0dp" android:paddingLeft="@dimen/element_spacing_normal" + android:background="?selectableItemBackground" android:paddingRight="@dimen/element_spacing_normal" android:paddingTop="0dp" android:text="@string/gallery" /> @@ -174,6 +177,7 @@ - - - - @@ -321,7 +325,7 @@ android:layout_weight="1" android:text="@string/profile_background_color" android:textAllCaps="true" - android:textAppearance="?android:attr/textAppearanceSmall" + android:textAppearance="?android:textAppearanceSmall" android:textColor="?android:textColorPrimary" android:textStyle="bold" /> @@ -341,11 +345,7 @@ android:visibility="visible" tools:visibility="gone"> - + \ No newline at end of file diff --git a/twidere/src/main/res/layout/actionbar_custom_view_message_user_picker.xml b/twidere/src/main/res/layout/layout_actionbar_message_user_picker.xml similarity index 100% rename from twidere/src/main/res/layout/actionbar_custom_view_message_user_picker.xml rename to twidere/src/main/res/layout/layout_actionbar_message_user_picker.xml diff --git a/twidere/src/main/res/values-v21/styles.xml b/twidere/src/main/res/values-v21/styles.xml index 9a860e952..aafeb5acb 100644 --- a/twidere/src/main/res/values-v21/styles.xml +++ b/twidere/src/main/res/values-v21/styles.xml @@ -16,6 +16,7 @@ @dimen/elevation_card 2dp ?android:colorBackground + circle