menu button to open sliding menu should work

improved user profile editor
This commit is contained in:
Mariotaku Lee 2015-04-28 11:58:47 +08:00
parent 85aa0299ab
commit 42bca8487c
5 changed files with 77 additions and 71 deletions

View File

@ -23,23 +23,18 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.os.Build; import android.os.Build;
import android.support.v4.view.LayoutInflaterCompat; import android.support.v4.view.LayoutInflaterCompat;
import android.support.v7.widget.ActionMenuView; import android.view.KeyEvent;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Window; import android.view.Window;
import org.mariotaku.twidere.Constants; import org.mariotaku.twidere.Constants;
import org.mariotaku.twidere.activity.iface.IThemedActivity; import org.mariotaku.twidere.activity.iface.IThemedActivity;
import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory; import org.mariotaku.twidere.util.ThemedLayoutInflaterFactory;
import org.mariotaku.twidere.util.support.ViewSupport;
import java.lang.reflect.Field;
/** /**
* Created by mariotaku on 15/4/22. * Created by mariotaku on 15/4/22.
*/ */
public class ThemedAppCompatDelegate implements Constants { public class ThemedAppCompatDelegateFactory implements Constants {
/** /**
@ -47,46 +42,24 @@ public class ThemedAppCompatDelegate implements Constants {
* *
* @param callback An optional callback for AppCompat specific events * @param callback An optional callback for AppCompat specific events
*/ */
public static AppCompatDelegate create(IThemedActivity themed, AppCompatCallback callback) { public static ThemedAppCompatDelegate create(IThemedActivity themed, AppCompatCallback callback) {
final Activity activity = (Activity) themed; final Activity activity = (Activity) themed;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return new ThemedAppCompatDelegateImplV11(themed, activity, activity.getWindow(), callback); return new ThemedAppCompatDelegate(themed, activity, activity.getWindow(), callback);
} else { } else {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
} }
private static class ThemedAppCompatDelegateImplV11 extends AppCompatDelegateImplV11 { public static final class ThemedAppCompatDelegate extends AppCompatDelegateImplV11 {
private final IThemedActivity themed; private final IThemedActivity themed;
private KeyListener keyListener;
private ThemedAppCompatDelegateImplV11(final IThemedActivity themed, final Context context, private ThemedAppCompatDelegate(final IThemedActivity themed, final Context context,
Window window, AppCompatCallback callback) { Window window, AppCompatCallback callback) {
super(context, window, callback); super(context, window, callback);
this.themed = themed; this.themed = themed;
// try {
// final Field field = AppCompatDelegateImplV7.class.getDeclaredField("mInvalidatePanelMenuRunnable");
// field.setAccessible(true);
// final Runnable old = (Runnable) field.get(this);
// field.set(this, new Runnable() {
// @Override
// public void run() {
// if (old != null) {
// old.run();
// }
// final int themeColor = themed.getCurrentThemeColor();
// final int themeId = themed.getCurrentThemeResourceId();
// final int itemColor = ThemeUtils.getContrastActionBarItemColor(context, themeId, themeColor);
// final Toolbar toolbar = ThemeUtils.getToolbarFromActivity((Activity) themed);
// if (toolbar != null) {
// ThemeUtils.setActionBarOverflowColor(toolbar, itemColor);
// ThemeUtils.wrapToolbarMenuIcon(ViewSupport.findViewByType(toolbar, ActionMenuView.class), itemColor, itemColor);
// }
// }
// });
// } catch (Exception ignore) {
//
// }
} }
@Override @Override
@ -96,6 +69,28 @@ public class ThemedAppCompatDelegate implements Constants {
LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(themed, this)); LayoutInflaterCompat.setFactory(inflater, new ThemedLayoutInflaterFactory(themed, this));
} }
} }
@Override
boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyListener != null && keyListener.onKeyDown(keyCode, event)) return true;
return super.onKeyDown(keyCode, event);
}
@Override
boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyListener != null && keyListener.onKeyUp(keyCode, event)) return true;
return super.onKeyUp(keyCode, event);
}
public void setKeyListener(KeyListener listener) {
keyListener = listener;
}
} }
public static interface KeyListener {
boolean onKeyDown(int keyCode, KeyEvent event);
boolean onKeyUp(int keyCode, KeyEvent event);
}
} }

View File

@ -43,6 +43,7 @@ import android.support.v4.app.FragmentManager;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.ThemedAppCompatDelegateFactory;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent; import android.view.KeyEvent;
@ -96,11 +97,11 @@ import org.mariotaku.twidere.util.ReadStateManager;
import org.mariotaku.twidere.util.ThemeUtils; import org.mariotaku.twidere.util.ThemeUtils;
import org.mariotaku.twidere.util.TwidereColorUtils; import org.mariotaku.twidere.util.TwidereColorUtils;
import org.mariotaku.twidere.util.Utils; import org.mariotaku.twidere.util.Utils;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.message.TaskStateChangedEvent; import org.mariotaku.twidere.util.message.TaskStateChangedEvent;
import org.mariotaku.twidere.util.message.UnreadCountUpdatedEvent; import org.mariotaku.twidere.util.message.UnreadCountUpdatedEvent;
import org.mariotaku.twidere.util.support.ActivitySupport;
import org.mariotaku.twidere.util.support.ActivitySupport.TaskDescriptionCompat;
import org.mariotaku.twidere.util.support.ViewSupport;
import org.mariotaku.twidere.view.ExtendedViewPager; import org.mariotaku.twidere.view.ExtendedViewPager;
import org.mariotaku.twidere.view.HomeSlidingMenu; import org.mariotaku.twidere.view.HomeSlidingMenu;
import org.mariotaku.twidere.view.LeftDrawerFrameLayout; import org.mariotaku.twidere.view.LeftDrawerFrameLayout;
@ -217,20 +218,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
mControlBarShowHideHelper.setControlBarVisibleAnimate(visible); mControlBarShowHideHelper.setControlBarVisibleAnimate(visible);
} }
@Override
public boolean onKeyUp(final int keyCode, @NonNull final KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_MENU: {
if (mSlidingMenu != null) {
mSlidingMenu.toggle(true);
return true;
}
break;
}
}
return super.onKeyUp(keyCode, event);
}
@Override @Override
public boolean onOptionsItemSelected(final MenuItem item) { public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
@ -400,6 +387,27 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
initUnreadCount(); initUnreadCount();
updateActionsButton(); updateActionsButton();
updateSlidingMenuTouchMode(); updateSlidingMenuTouchMode();
getDelegate().setKeyListener(new ThemedAppCompatDelegateFactory.KeyListener() {
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// Steal MENU key event
switch (keyCode) {
case KeyEvent.KEYCODE_MENU: {
if (mSlidingMenu != null) {
mSlidingMenu.toggle(true);
return true;
}
break;
}
}
return false;
}
});
if (savedInstanceState == null) { if (savedInstanceState == null) {
if (refreshOnStart) { if (refreshOnStart) {
@ -646,17 +654,6 @@ public class HomeActivity extends BaseAppCompatActivity implements OnClickListen
return 1 + mTabsContainer.getTranslationY() / totalHeight; return 1 + mTabsContainer.getTranslationY() / totalHeight;
} }
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && event.getAction() == KeyEvent.ACTION_UP) {
if (mSlidingMenu != null) {
mSlidingMenu.toggle(true);
return true;
}
}
return super.dispatchKeyEvent(event);
}
@Override @Override
public void onContentChanged() { public void onContentChanged() {
super.onContentChanged(); super.onContentChanged();

View File

@ -75,12 +75,15 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() { private final View.OnLayoutChangeListener mLayoutChangeListener = new View.OnLayoutChangeListener() {
private final Rect tempInsets = new Rect(); private final Rect tempInsets = new Rect();
private boolean compatCalled;
@Override @Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) { if (compatCalled) return;
if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom && !ViewSupport.isInLayout(v)) {
mMainContent.getSystemWindowsInsets(tempInsets); mMainContent.getSystemWindowsInsets(tempInsets);
onFitSystemWindows(tempInsets); onFitSystemWindows(tempInsets);
compatCalled = true;
} }
} }
}; };
@ -122,10 +125,15 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
final View actionBarContainer = findViewById(R.id.twidere_action_bar_container); final View actionBarContainer = findViewById(R.id.twidere_action_bar_container);
if (actionBarContainer != null) { if (actionBarContainer != null) {
final ViewGroup.LayoutParams toolBarParams = actionBarContainer.getLayoutParams(); final ViewGroup.LayoutParams toolBarParams = actionBarContainer.getLayoutParams();
boolean changed = false;
if (toolBarParams instanceof ViewGroup.MarginLayoutParams) { if (toolBarParams instanceof ViewGroup.MarginLayoutParams) {
final int topMargin = ((ViewGroup.MarginLayoutParams) toolBarParams).topMargin;
changed = topMargin != insets.top;
((ViewGroup.MarginLayoutParams) toolBarParams).topMargin = insets.top; ((ViewGroup.MarginLayoutParams) toolBarParams).topMargin = insets.top;
} }
actionBarContainer.setLayoutParams(toolBarParams); if (changed) {
actionBarContainer.setLayoutParams(toolBarParams);
}
} }
insets.top += ThemeUtils.getActionBarHeight(this); insets.top += ThemeUtils.getActionBarHeight(this);
super.onFitSystemWindows(insets); super.onFitSystemWindows(insets);
@ -522,6 +530,10 @@ public class LinkHandlerActivity extends BaseAppCompatActivity implements System
setTitle(R.string.view_map); setTitle(R.string.view_map);
break; break;
} }
case LINK_ID_PROFILE_EDITOR: {
setTitle(R.string.edit_profile);
break;
}
default: { default: {
setTitle(getString(R.string.app_name)); setTitle(getString(R.string.app_name));
break; break;

View File

@ -24,8 +24,7 @@ import android.os.Bundle;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity; import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate; import android.support.v7.app.ThemedAppCompatDelegateFactory;
import android.support.v7.app.ThemedAppCompatDelegate;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.View; import android.view.View;
@ -44,7 +43,7 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen
private String mCurrentThemeBackgroundOption; private String mCurrentThemeBackgroundOption;
private String mCurrentThemeFontFamily; private String mCurrentThemeFontFamily;
private AppCompatDelegate mDelegate; private ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate mDelegate;
private Toolbar mToolbar; private Toolbar mToolbar;
@Override @Override
@ -115,9 +114,9 @@ public abstract class ThemedAppCompatActivity extends AppCompatActivity implemen
} }
@Override @Override
public AppCompatDelegate getDelegate() { public ThemedAppCompatDelegateFactory.ThemedAppCompatDelegate getDelegate() {
if (mDelegate != null) return mDelegate; if (mDelegate != null) return mDelegate;
return mDelegate = ThemedAppCompatDelegate.create(this, this); return mDelegate = ThemedAppCompatDelegateFactory.create(this, this);
} }
@Override @Override

View File

@ -57,6 +57,7 @@ import org.mariotaku.twidere.util.AsyncTaskManager;
import org.mariotaku.twidere.util.AsyncTaskUtils; import org.mariotaku.twidere.util.AsyncTaskUtils;
import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileBannerImageTask; import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileBannerImageTask;
import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileImageTask; import org.mariotaku.twidere.util.AsyncTwitterWrapper.UpdateProfileImageTask;
import org.mariotaku.twidere.util.KeyboardShortcutsHandler;
import org.mariotaku.twidere.util.MediaLoaderWrapper; import org.mariotaku.twidere.util.MediaLoaderWrapper;
import org.mariotaku.twidere.util.ParseUtils; import org.mariotaku.twidere.util.ParseUtils;
import org.mariotaku.twidere.util.TwitterWrapper; import org.mariotaku.twidere.util.TwitterWrapper;
@ -72,7 +73,8 @@ import static android.text.TextUtils.isEmpty;
import static org.mariotaku.twidere.util.Utils.getTwitterInstance; import static org.mariotaku.twidere.util.Utils.getTwitterInstance;
public class UserProfileEditorFragment extends BaseSupportFragment implements OnSizeChangedListener, TextWatcher, public class UserProfileEditorFragment extends BaseSupportFragment implements OnSizeChangedListener, TextWatcher,
OnClickListener, LoaderCallbacks<SingleResponse<ParcelableUser>> { OnClickListener, LoaderCallbacks<SingleResponse<ParcelableUser>>,
KeyboardShortcutsHandler.TakeAllKeyboardShortcut {
private static final int LOADER_ID_USER = 1; private static final int LOADER_ID_USER = 1;
@ -478,6 +480,7 @@ public class UserProfileEditorFragment extends BaseSupportFragment implements On
if (f instanceof DialogFragment) { if (f instanceof DialogFragment) {
((DialogFragment) f).dismissAllowingStateLoss(); ((DialogFragment) f).dismissAllowingStateLoss();
} }
mFragment.getActivity().finish();
} }
@Override @Override