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