diff --git a/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegate.java b/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegate.java index a8a8242bf..4a63cbc15 100644 --- a/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegate.java +++ b/twidere/src/main/java/android/support/v7/app/ThemedAppCompatDelegate.java @@ -22,9 +22,11 @@ package android.support.v7.app; import android.app.Activity; import android.content.Context; import android.os.Build; +import android.support.annotation.NonNull; import android.support.v4.view.LayoutInflaterCompat; import android.support.v4.view.LayoutInflaterFactory; import android.util.AttributeSet; +import android.view.InflateException; import android.view.LayoutInflater; import android.view.View; import android.view.Window; @@ -33,6 +35,11 @@ import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.util.ThemeUtils; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + /** * Created by mariotaku on 15/4/22. */ @@ -56,6 +63,7 @@ public class ThemedAppCompatDelegate implements Constants { private static class ThemedAppCompatDelegateImplV11 extends AppCompatDelegateImplV11 { private final IThemedActivity themed; + private static final Map sConstructorCache = new HashMap<>(); private ThemedAppCompatDelegateImplV11(IThemedActivity themed, Context context, Window window, AppCompatCallback callback) { super(context, window, callback); @@ -69,6 +77,26 @@ public class ThemedAppCompatDelegate implements Constants { LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(themed, this)); } } + + @Override + public View createView(View parent, String name, @NonNull Context context, @NonNull AttributeSet attrs) { + View view = super.createView(parent, name, context, attrs); + if (view == null && name.contains(".")) { + try { + Constructor constructor = sConstructorCache.get(name); + if (constructor == null) { + final Class viewCls = Class.forName(name); + constructor = viewCls.getConstructor(Context.class, AttributeSet.class); + sConstructorCache.put(name, constructor); + } + view = (View) constructor.newInstance(context, attrs); + } catch (ClassNotFoundException ignore) { + } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException e) { + throw new InflateException(e); + } + } + return view; + } } /** @@ -87,7 +115,7 @@ public class ThemedAppCompatDelegate implements Constants { @Override public View onCreateView(View view, String s, Context context, AttributeSet attributeSet) { final View createdView = delegate.onCreateView(view, s, context, attributeSet); - ThemeUtils.initView(createdView, activity.getCurrentThemeColor(), activity.getCurrentProfileImageStyle()); + ThemeUtils.initView(createdView, activity); return createdView; } } 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 8254034d4..9979e5d07 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/BasePreferenceActivity.java @@ -20,7 +20,6 @@ package org.mariotaku.twidere.activity; import android.annotation.SuppressLint; -import android.content.Context; import android.os.Build; import android.os.Bundle; import android.support.annotation.LayoutRes; @@ -32,7 +31,7 @@ import android.support.v7.widget.Toolbar; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; -import android.util.AttributeSet; +import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.view.ViewGroup; @@ -42,6 +41,8 @@ import android.widget.FrameLayout; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.iface.IThemedActivity; +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.Utils; @@ -50,7 +51,7 @@ import org.mariotaku.twidere.view.ShapedImageView.ShapeStyle; import org.mariotaku.twidere.view.TintedStatusFrameLayout; public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity implements Constants, - IThemedActivity { + IThemedActivity, KeyboardShortcutsHandler.KeyboardShortcutCallback { private TintedStatusFrameLayout mMainContent; @@ -58,6 +59,13 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity @ShapeStyle private int mProfileImageStyle; private String mCurrentThemeBackgroundOption; + private KeyboardShortcutsHandler mKeyboardShortcutsHandler; + private String mCurrentThemeFontFamily; + + @Override + public String getCurrentThemeFontFamily() { + return mCurrentThemeFontFamily; + } @Override public int getCurrentThemeBackgroundAlpha() { @@ -95,6 +103,7 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity } @Override + @ShapeStyle public int getCurrentProfileImageStyle() { return mProfileImageStyle; } @@ -118,6 +127,16 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity getCurrentThemeColor(), getThemeBackgroundOption(), true); } + @Override + public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event) { + return false; + } + + @Override + public boolean handleKeyboardShortcutRepeat(@NonNull KeyboardShortcutsHandler handler, int keyCode, int repeatCount, @NonNull KeyEvent event) { + return false; + } + @Override protected void onCreate(final Bundle savedInstanceState) { if (Utils.isDebugBuild()) { @@ -128,6 +147,20 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity setupWindow(); super.onCreate(savedInstanceState); setupActionBar(); + mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler(); + } + + @Override + public boolean onKeyUp(int keyCode, @NonNull KeyEvent event) { + if (handleKeyboardShortcutSingle(mKeyboardShortcutsHandler, keyCode, event)) return true; + return super.onKeyUp(keyCode, event); + } + + @Override + public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { + if (handleKeyboardShortcutRepeat(mKeyboardShortcutsHandler, keyCode, event.getRepeatCount(), event)) + return true; + return super.onKeyDown(keyCode, event); } @Override @@ -208,13 +241,6 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity return result; } - @Override - public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) { - final View view = super.onCreateView(name, context, attrs); - ThemeUtils.initView(view, getCurrentThemeColor(), mProfileImageStyle); - return view; - } - protected boolean shouldSetActionItemColor() { return true; } @@ -235,6 +261,7 @@ public abstract class BasePreferenceActivity extends AppCompatPreferenceActivity mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); mProfileImageStyle = Utils.getProfileImageStyle(this); mCurrentThemeBackgroundOption = getThemeBackgroundOption(); + mCurrentThemeFontFamily = getThemeFontFamily(); setTheme(mCurrentThemeResource); ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java index 512421349..2363a115d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/BaseThemedActivity.java @@ -27,6 +27,7 @@ import org.mariotaku.twidere.util.CompareUtils; import org.mariotaku.twidere.util.StrictModeUtils; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.Utils; +import org.mariotaku.twidere.view.ShapedImageView; public abstract class BaseThemedActivity extends Activity implements IThemedActivity { @@ -37,6 +38,11 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi private String mCurrentThemeBackgroundOption; private int mProfileImageStyle; + @Override + public String getCurrentThemeFontFamily() { + return mCurrentThemeFontFamily; + } + @Override public int getCurrentThemeBackgroundAlpha() { return mCurrentThemeBackgroundAlpha; @@ -74,6 +80,7 @@ public abstract class BaseThemedActivity extends Activity implements IThemedActi public abstract int getThemeResourceId(); @Override + @ShapedImageView.ShapeStyle public int getCurrentProfileImageStyle() { return mProfileImageStyle; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java index 8da841f61..f5c0f51dc 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/SettingsActivity.java @@ -32,6 +32,7 @@ import android.support.annotation.NonNull; import android.support.v4.view.WindowCompat; import android.support.v7.app.ActionBar; import android.text.TextUtils; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -52,6 +53,7 @@ import org.mariotaku.twidere.R; import org.mariotaku.twidere.activity.support.DataExportActivity; import org.mariotaku.twidere.activity.support.DataImportActivity; import org.mariotaku.twidere.graphic.EmptyDrawable; +import org.mariotaku.twidere.util.KeyboardShortcutsHandler; import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.view.holder.ViewListHolder; @@ -210,6 +212,21 @@ public class SettingsActivity extends BasePreferenceActivity { } } + @Override + public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event) { + final String action = handler.getKeyAction(CONTEXT_TAG_NAVIGATION, keyCode, event); + if (ACTION_NAVIGATION_BACK.equals(action)) { + onBackPressed(); + return true; + } + return super.handleKeyboardShortcutSingle(handler, keyCode, event); + } + + @Override + public boolean handleKeyboardShortcutRepeat(@NonNull KeyboardShortcutsHandler handler, int keyCode, int repeatCount, @NonNull KeyEvent event) { + return super.handleKeyboardShortcutRepeat(handler, keyCode, repeatCount, event); + } + public static void setShouldNotifyChange(Activity activity) { if (!(activity instanceof SettingsActivity)) return; ((SettingsActivity) activity).setShouldNotifyChange(true); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java index 09c0875f3..e2d2348fb 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/iface/IThemedActivity.java @@ -19,6 +19,8 @@ package org.mariotaku.twidere.activity.iface; +import org.mariotaku.twidere.view.ShapedImageView; + public interface IThemedActivity { int getCurrentThemeBackgroundAlpha(); @@ -37,8 +39,11 @@ public interface IThemedActivity { String getThemeFontFamily(); + String getCurrentThemeFontFamily(); + int getThemeResourceId(); + @ShapedImageView.ShapeStyle int getCurrentProfileImageStyle(); void restart(); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java index 8fd792a64..c4f26efa2 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseAppCompatActivity.java @@ -50,9 +50,9 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co // Registered listeners private ArrayList mControlBarOffsetListeners = new ArrayList<>(); + // Data fields private boolean mInstanceStateSaved; private boolean mIsVisible; - private Rect mSystemWindowsInsets; @Override @@ -129,10 +129,6 @@ public class BaseAppCompatActivity extends ThemedAppCompatActivity implements Co return false; } - protected boolean isStateSaved() { - return mInstanceStateSaved; - } - @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java index c922e0950..07024196d 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/BaseSupportDialogActivity.java @@ -23,12 +23,11 @@ import android.annotation.SuppressLint; import android.os.Bundle; import org.mariotaku.twidere.Constants; -import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.app.TwidereApplication; import org.mariotaku.twidere.util.ThemeUtils; @SuppressLint("Registered") -public class BaseSupportDialogActivity extends ThemedFragmentActivity implements Constants, IThemedActivity { +public class BaseSupportDialogActivity extends ThemedFragmentActivity implements Constants { private boolean mInstanceStateSaved; 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 6ea29a615..2c095f72c 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 @@ -115,6 +115,11 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System @Override public boolean handleKeyboardShortcutSingle(@NonNull KeyboardShortcutsHandler handler, int keyCode, @NonNull KeyEvent event) { if (handleFragmentKeyboardShortcutSingle(handler, keyCode, event)) return true; + final String action = handler.getKeyAction(CONTEXT_TAG_NAVIGATION, keyCode, event); + if (ACTION_NAVIGATION_BACK.equals(action)) { + onBackPressed(); + return true; + } return handler.handleKey(this, null, keyCode, event); } @@ -142,7 +147,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System mMainContent.setOnFitSystemWindowsListener(this); setStatusBarColor(linkId, data); setTaskInfo(linkId, data); - setSupportProgressBarIndeterminateVisibility(false); if (!showFragment(linkId, data)) { finish(); } @@ -224,11 +228,6 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System return true; } } - final String action = handler.getKeyAction(CONTEXT_TAG_NAVIGATION, keyCode, event); - if (ACTION_NAVIGATION_BACK.equals(action)) { - onBackPressed(); - return true; - } return false; } diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java index ab541c154..cb3b116af 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedAppCompatActivity.java @@ -37,9 +37,15 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen @ShapeStyle private int mProfileImageStyle; private String mCurrentThemeBackgroundOption; + private String mCurrentThemeFontFamily; private AppCompatDelegate mDelegate; + @Override + public String getCurrentThemeFontFamily() { + return mCurrentThemeFontFamily; + } + @Override public int getCurrentThemeBackgroundAlpha() { return mCurrentThemeBackgroundAlpha; @@ -76,6 +82,7 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen } @Override + @ShapeStyle public int getCurrentProfileImageStyle() { return mProfileImageStyle; } @@ -114,6 +121,7 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); mProfileImageStyle = Utils.getProfileImageStyle(this); mCurrentThemeBackgroundOption = getThemeBackgroundOption(); + mCurrentThemeFontFamily = getThemeFontFamily(); setTheme(mCurrentThemeResource); ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha); diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java index 5c14304ce..ffafbd842 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/ThemedFragmentActivity.java @@ -19,16 +19,13 @@ package org.mariotaku.twidere.activity.support; -import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.FragmentActivity; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; -import android.util.AttributeSet; import android.view.KeyEvent; -import android.view.View; import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.activity.iface.IThemedActivity; @@ -51,6 +48,12 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements @ShapeStyle private int mProfileImageStyle; private String mCurrentThemeBackgroundOption; + private String mCurrentThemeFontFamily; + + @Override + public String getCurrentThemeFontFamily() { + return mCurrentThemeFontFamily; + } @Override public int getCurrentThemeBackgroundAlpha() { @@ -88,6 +91,7 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements } @Override + @ShapeStyle public int getCurrentProfileImageStyle() { return mProfileImageStyle; } @@ -108,13 +112,6 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements mKeyboardShortcutsHandler = TwidereApplication.getInstance(this).getKeyboardShortcutsHandler(); } - @Override - public View onCreateView(String name, @NonNull Context context, @NonNull AttributeSet attrs) { - final View view = super.onCreateView(name, context, attrs); - ThemeUtils.initView(view, getCurrentThemeColor(), mProfileImageStyle); - return view; - } - @Override protected void onTitleChanged(CharSequence title, int color) { final SpannableStringBuilder builder = new SpannableStringBuilder(title); @@ -133,6 +130,7 @@ public abstract class ThemedFragmentActivity extends FragmentActivity implements mCurrentThemeBackgroundAlpha = getThemeBackgroundAlpha(); mProfileImageStyle = Utils.getProfileImageStyle(this); mCurrentThemeBackgroundOption = getThemeBackgroundOption(); + mCurrentThemeFontFamily = getThemeFontFamily(); setTheme(mCurrentThemeResource); ThemeUtils.applyWindowBackground(this, getWindow(), mCurrentThemeResource, mCurrentThemeBackgroundOption, mCurrentThemeBackgroundAlpha); } diff --git a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java index b75c03c4b..7a35a12ee 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java +++ b/twidere/src/main/java/org/mariotaku/twidere/fragment/support/AbsStatusesFragment.java @@ -96,7 +96,6 @@ public abstract class AbsStatusesFragment extends AbsContentListFragment> mUnreadCountsToRemove = new LongSparseArray<>(); @@ -122,12 +122,17 @@ public class DirectMessagesFragment extends AbsContentListFragment