diff --git a/app/build.gradle b/app/build.gradle index 972c4cbf..0e632038 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,6 +58,7 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'androidx.legacy:legacy-support-v4:1.0.0' androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { exclude group: 'com.android.support', module: 'support-annotations' exclude group: 'com.google.code.findbugs' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6a8516a..777da2a7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ diff --git a/app/src/main/java/me/ghui/v2er/general/Navigator.java b/app/src/main/java/me/ghui/v2er/general/Navigator.java index 41b8da12..721013fb 100644 --- a/app/src/main/java/me/ghui/v2er/general/Navigator.java +++ b/app/src/main/java/me/ghui/v2er/general/Navigator.java @@ -5,11 +5,17 @@ import android.content.Context; import android.content.Intent; import androidx.core.app.ActivityOptionsCompat; +import androidx.core.util.Pair; + import android.view.View; import java.io.Serializable; import java.lang.ref.WeakReference; import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; /** @@ -75,6 +81,23 @@ public Navigator addFlag(int flag) { return this; } + public Navigator shareElement(View... sourceViews) { + Pair[] sharedElements; + List sourceViewList = new ArrayList<>(sourceViews.length); + Collections.addAll(sourceViewList, sourceViews); + sourceViewList.removeIf(sourceView -> sourceView.getTransitionName() == null || sourceView.getTransitionName().isEmpty()); + sharedElements = new Pair[sourceViewList.size()]; + for (int i = 0; i < sourceViewList.size(); i++) { + sharedElements[i] = new Pair<>(sourceViewList.get(i), + sourceViewList.get(i).getTransitionName()); + } + if (sharedElements.length > 0) { + mOptionsCompat = ActivityOptionsCompat. + makeSceneTransitionAnimation((Activity) mFrom.get(), sharedElements); + } + return this; + } + public Navigator shareElement(View sourceView) { if (sourceView != null && sourceView.getTransitionName() != null) { mOptionsCompat = ActivityOptionsCompat. diff --git a/app/src/main/java/me/ghui/v2er/general/PageHost.java b/app/src/main/java/me/ghui/v2er/general/PageHost.java index dff7fbcf..608e0a3c 100644 --- a/app/src/main/java/me/ghui/v2er/general/PageHost.java +++ b/app/src/main/java/me/ghui/v2er/general/PageHost.java @@ -8,6 +8,7 @@ import me.ghui.v2er.module.settings.ContactFragment; import me.ghui.v2er.module.settings.SettingFragment; import me.ghui.v2er.util.Utils; +import me.ghui.v2er.widget.BaseToolBar; public class PageHost extends BaseActivity { public static final String PAGE_ID = "PageHost.pageId"; @@ -21,7 +22,6 @@ protected int attachLayoutRes() { @Override protected void init() { super.init(); - Utils.setPaddingForStatusBar(mRootView); mPage = (Page) getIntent().getSerializableExtra(PAGE_ID); if (mPage == null) { throw new RuntimeException("wrong page id"); @@ -38,6 +38,14 @@ public void reloadMode(int mode) { .reload(); } + @Override + protected void configToolBar(BaseToolBar toolBar) { + super.configToolBar(toolBar); + if (toolBar != null) { + toolBar.displayHomeAsUpButton(this); + } + } + private Fragment getFragment(Page pageID) { Fragment fragment; String title; diff --git a/app/src/main/java/me/ghui/v2er/helper/BottomNavigationViewHelper.java b/app/src/main/java/me/ghui/v2er/helper/BottomNavigationViewHelper.java new file mode 100644 index 00000000..65b5765a --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/helper/BottomNavigationViewHelper.java @@ -0,0 +1,31 @@ +package me.ghui.v2er.helper; + +import android.widget.ImageView; + +import com.google.android.material.bottomnavigation.BottomNavigationItemView; +import com.google.android.material.bottomnavigation.BottomNavigationMenuView; +import com.google.android.material.bottomnavigation.BottomNavigationView; + +public class BottomNavigationViewHelper { + + /** + * 设置图片尺寸 + * @param view + * @param width + * @param height + */ + public static void setImageSize(BottomNavigationView view, int width, int height) { + BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0); + try { + for (int i = 0; i < menuView.getChildCount(); i++) { + BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i); + ImageView imageView = item.findViewById(com.google.android.material.R.id.icon); + imageView.getLayoutParams().width = width; + imageView.getLayoutParams().height = height; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/me/ghui/v2er/injector/component/MineComponent.java b/app/src/main/java/me/ghui/v2er/injector/component/MineComponent.java new file mode 100644 index 00000000..b1e5a51b --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/injector/component/MineComponent.java @@ -0,0 +1,12 @@ +package me.ghui.v2er.injector.component; + +import dagger.Component; +import me.ghui.v2er.injector.module.MineModule; +import me.ghui.v2er.injector.scope.PerFragment; +import me.ghui.v2er.module.home.MineFragment; + +@PerFragment +@Component(dependencies = AppComponent.class, modules = MineModule.class) +public interface MineComponent { + void inject(MineFragment fragment); +} diff --git a/app/src/main/java/me/ghui/v2er/injector/module/MineModule.java b/app/src/main/java/me/ghui/v2er/injector/module/MineModule.java new file mode 100644 index 00000000..3a5764c7 --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/injector/module/MineModule.java @@ -0,0 +1,29 @@ +package me.ghui.v2er.injector.module; + +import dagger.Module; +import dagger.Provides; +import me.ghui.v2er.adapter.base.MultiItemTypeAdapter; +import me.ghui.v2er.injector.scope.PerFragment; +import me.ghui.v2er.module.home.MineContract; +import me.ghui.v2er.module.home.MineFragment; +import me.ghui.v2er.module.home.MinePresenter; +import me.ghui.v2er.module.home.MsgContract; +import me.ghui.v2er.module.home.MsgPresenter; +import me.ghui.v2er.network.bean.UserPageInfo; + +@Module +public class MineModule { + + private MineFragment mView; + + public MineModule(MineFragment mView) { + this.mView = mView; + } + + @PerFragment + @Provides + public MineContract.IPresenter providePresenter() { + return new MinePresenter(mView); + } + +} diff --git a/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java b/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java index d282dace..a0d81f90 100644 --- a/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/append/AppendTopicActivity.java @@ -67,8 +67,6 @@ protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); //设置右上角的填充菜单 toolBar.inflateMenu(R.menu.append_topic_menu); - Utils.setPaddingForStatusBar(toolBar); - Utils.setPaddingForNavbar(mRootView); toolBar.setOnMenuItemClickListener(item -> { String content = mContentET.getText().toString(); if (Check.isEmpty(content)) { diff --git a/app/src/main/java/me/ghui/v2er/module/base/BaseActivity.java b/app/src/main/java/me/ghui/v2er/module/base/BaseActivity.java index 29b51173..9e2a2fbf 100644 --- a/app/src/main/java/me/ghui/v2er/module/base/BaseActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/base/BaseActivity.java @@ -2,6 +2,7 @@ import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; import androidx.annotation.CallSuper; @@ -12,6 +13,7 @@ import com.google.android.material.appbar.AppBarLayout; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.appcompat.app.AppCompatActivity; @@ -24,7 +26,10 @@ import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toolbar; import com.r0adkll.slidr.model.SlidrInterface; import com.trello.rxlifecycle2.LifecycleTransformer; @@ -32,6 +37,7 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.lang.reflect.Field; import java.util.Stack; import javax.inject.Inject; @@ -87,7 +93,7 @@ public abstract class BaseActivity extends Rx @Nullable protected SlidrInterface mSlidrInterface; protected DayNightModeEvent mDayNightModeEvent; - + private boolean displayStatusBarArea = true; protected static String KEY(String key) { return Utils.KEY(key); @@ -105,6 +111,16 @@ public void setFirstLoadingDelay(long delay) { @LayoutRes protected abstract int attachLayoutRes(); + + /** + * 显示状态栏区域 + * 在attachToolbar调用,或者之前 + * @param displayStatusBarArea + */ + public void displayStatusBarArea(boolean displayStatusBarArea) { + this.displayStatusBarArea = displayStatusBarArea; + } + /** * Set a default Toolbar, if you don't want certain page to have a toolbar, * just return null; @@ -343,6 +359,26 @@ protected void autoLoad() { } } + /** + * 查找Appbar + * @param viewGroup + */ + private void findAppbar(ViewGroup viewGroup) { + if (viewGroup instanceof BaseToolBar) { + mToolbar = (BaseToolBar) viewGroup; + } else { + int childCount = viewGroup.getChildCount(); + for (int i = 0; i < childCount; i++) { + View childView = viewGroup.getChildAt(i); + if (childView instanceof ViewGroup) { + findAppbar((ViewGroup) childView); + } else { + continue; + } + } + } + } + protected ViewGroup onCreateRootView() { if ((mToolbar = attachToolbar()) != null) { LinearLayout rootView = new LinearLayout(this); @@ -377,6 +413,15 @@ protected ViewGroup onCreateRootView() { mRootView.setId(R.id.act_root_view_framelayout); mRootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mRootView.addView(mContentView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + if (displayStatusBarArea) { + mRootView.setFitsSystemWindows(true); + } else { + mRootView.setFitsSystemWindows(false); + findAppbar(mRootView); + if (mToolbar != null) { + Utils.setPaddingForStatusBar(mToolbar); + } + } mRootView.setBackgroundColor(pageColor()); return mRootView; } diff --git a/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java b/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java index f8fe2b37..3a738c0b 100644 --- a/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/create/CreateTopicActivity.java @@ -107,8 +107,7 @@ protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); toolBar.inflateMenu(R.menu.post_topic_menu);//设置右上角的填充菜单 toolBar.setOnMenuItemClickListener(this); - Utils.setPaddingForStatusBar(toolBar); - Utils.setPaddingForNavbar(mRootView); + toolBar.displayHomeAsUpButton(this); } @Override diff --git a/app/src/main/java/me/ghui/v2er/module/drawer/care/SpecialCareActivity.java b/app/src/main/java/me/ghui/v2er/module/drawer/care/SpecialCareActivity.java index 3f1264a3..f9a4db3d 100644 --- a/app/src/main/java/me/ghui/v2er/module/drawer/care/SpecialCareActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/drawer/care/SpecialCareActivity.java @@ -55,7 +55,7 @@ protected void startInject() { @Override protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); - Utils.setPaddingForStatusBar(toolBar); + toolBar.displayHomeAsUpButton(this); } @Override diff --git a/app/src/main/java/me/ghui/v2er/module/drawer/dailyhot/DailyHotActivity.java b/app/src/main/java/me/ghui/v2er/module/drawer/dailyhot/DailyHotActivity.java index 7ce08027..f5a67839 100644 --- a/app/src/main/java/me/ghui/v2er/module/drawer/dailyhot/DailyHotActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/drawer/dailyhot/DailyHotActivity.java @@ -62,7 +62,6 @@ protected SwipeRefreshLayout.OnRefreshListener attachOnRefreshListener() { @Override protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); - Utils.setPaddingForStatusBar(toolBar); } @Override diff --git a/app/src/main/java/me/ghui/v2er/module/drawer/star/StarActivity.java b/app/src/main/java/me/ghui/v2er/module/drawer/star/StarActivity.java index 8adbb8fd..acca2313 100644 --- a/app/src/main/java/me/ghui/v2er/module/drawer/star/StarActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/drawer/star/StarActivity.java @@ -67,13 +67,12 @@ protected int attachLayoutRes() { protected void configToolBar() { mToolbar.setTitle(getTitle()); - mToolbar.setElevation(0); + mToolbar.displayHomeAsUpButton(this); mToolbar.setOnDoubleTapListener(this); mToolbar.setNavigationOnClickListener(view -> { if (isTaskRoot()) finishToHome(); else onBackPressed(); }); - Utils.setPaddingForStatusBar(mToolbar); } @Override diff --git a/app/src/main/java/me/ghui/v2er/module/gallery/GalleryActivity.java b/app/src/main/java/me/ghui/v2er/module/gallery/GalleryActivity.java index 785e3ed7..95f01560 100644 --- a/app/src/main/java/me/ghui/v2er/module/gallery/GalleryActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/gallery/GalleryActivity.java @@ -86,7 +86,6 @@ protected BaseToolBar attachToolbar() { @Override protected void init() { - Utils.setPaddingForStatusBar(mToolBar); mToolBar.inflateMenu(R.menu.gallery_toolbar_menu); mToolBar.setOverflowIcon(getDrawable(R.drawable.ic_more_vert_white)); mToolBar.setOnMenuItemClickListener(this); diff --git a/app/src/main/java/me/ghui/v2er/module/general/WapActivity.java b/app/src/main/java/me/ghui/v2er/module/general/WapActivity.java index adc1c5f9..2682b929 100644 --- a/app/src/main/java/me/ghui/v2er/module/general/WapActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/general/WapActivity.java @@ -88,7 +88,6 @@ protected void configWebView(WebSettings settings) { @Override protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); - Utils.setPaddingForStatusBar(toolBar); mToolbar.inflateMenu(R.menu.wapview_menu); mToolbar.setOnMenuItemClickListener(menuItem -> { switch (menuItem.getItemId()) { diff --git a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java index cdf3562c..d61fee93 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/home/MainActivity.java @@ -1,30 +1,18 @@ package me.ghui.v2er.module.home; import android.annotation.SuppressLint; -import android.content.Intent; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; -import androidx.appcompat.widget.SwitchCompat; -import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; -import com.bumptech.glide.request.target.Target; -import com.flyco.tablayout.listener.OnTabSelectListener; -import com.flyco.tablayout.widget.MsgView; import com.google.android.material.appbar.AppBarLayout; -import com.google.android.material.navigation.NavigationView; +import com.google.android.material.bottomnavigation.BottomNavigationView; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; @@ -34,70 +22,46 @@ import me.ghui.v2er.bus.Bus; import me.ghui.v2er.bus.event.TextSizeChangeEvent; import me.ghui.v2er.general.ActivityReloader; -import me.ghui.v2er.general.GlideApp; -import me.ghui.v2er.general.Navigator; -import me.ghui.v2er.general.Page; +import me.ghui.v2er.helper.BottomNavigationViewHelper; import me.ghui.v2er.module.base.BaseActivity; -import me.ghui.v2er.module.create.CreateTopicActivity; -import me.ghui.v2er.module.drawer.care.SpecialCareActivity; -import me.ghui.v2er.module.drawer.dailyhot.DailyHotActivity; -import me.ghui.v2er.module.drawer.star.StarActivity; -import me.ghui.v2er.module.login.LoginActivity; -import me.ghui.v2er.module.settings.UserManualActivity; -import me.ghui.v2er.module.user.UserHomeActivity; -import me.ghui.v2er.network.bean.UserInfo; -import me.ghui.v2er.util.DarkModelUtils; -import me.ghui.v2er.util.L; import me.ghui.v2er.util.ScaleUtils; -import me.ghui.v2er.util.Theme; -import me.ghui.v2er.util.UserUtils; import me.ghui.v2er.util.Utils; import me.ghui.v2er.util.ViewUtils; import me.ghui.v2er.widget.BaseToolBar; -import me.ghui.v2er.widget.CSlidingTabLayout; -import me.ghui.v2er.widget.FollowProgressBtn; -import me.ghui.v2er.widget.dialog.ConfirmDialog; -import me.ghui.v2er.widget.listener.AppBarStateChangeListener; -public class MainActivity extends BaseActivity implements View.OnClickListener, - UpdateUnReadMsgDelegate, CheckInContract.IView, OnTabSelectListener, +public class MainActivity extends BaseActivity implements View.OnClickListener, UpdateUnReadMsgDelegate, HomeFilterMenu.OnMenuItemClickListener { - private static final String TAB_INDEX = KEY("tab_index"); private static final String PAGE_ONE_DATA = KEY("page_one_data"); private static final String PAGE_TWO_DATA = KEY("page_two_data"); private static final String PAGE_THREE_DATA = KEY("page_three_data"); + private static final String PAGE_FOUR_DATA = KEY("page_four_data"); private static final String TOPIC_IS_APPBAR_EXPANDED = KEY("toolbar_is_appbar_expanded"); public static boolean isAlive; - private final String[] TAB_TITLES = {" 全部", "消息", "节点"}; - @BindView(R.id.left_draw_layout) - DrawerLayout mDrawerLayout; - @BindView(R.id.navigationview_main) - NavigationView mNavigationView; - @BindView(R.id.tablayout_main) - CSlidingTabLayout mSlidingTabLayout; + private final int[] titles = {R.string.feed, R.string.explore, + R.string.message, R.string.mine}; + private final int[] bottomNavigationViewItemIds = {R.id.feed_page, R.id.explore_page, + R.id.message_page, R.id.mine_page}; + @BindView(R.id.main_logo) + ImageView mLogoView; + @BindView(R.id.main_bottom_navigation_view) + BottomNavigationView mBottomNavigationView; @BindView(R.id.viewpager_main) ViewPager mViewPager; @BindView(R.id.main_toolbar) BaseToolBar mToolbar; - @BindView(R.id.tab_menu_container) - ViewGroup mTabMenuContainer; + @BindView(R.id.main_container) + ViewGroup mMainContainer; @BindView(R.id.main_appbar) AppBarLayout mAppBarLayout; + private NewsFragment mNewsFragment; private MsgFragment mMsgFragment; private NodesNavFragment mNavFragment; - private View mNavHeaderView; - private ImageView mAvatarImg; - private TextView mUserNameTv; - private FollowProgressBtn mCheckInBtn; - private CheckInPresenter mCheckInPresenter; - private TextView mTab1View; - private MenuItem mNightMenuItem; - private SwitchCompat mNightSwitch; - private HomeFilterMenu mFilterMenu; - private boolean isAppbarExpanted = true; + private MineFragment mMineFragment; + private boolean isAppbarExpanded = true; + @Override protected int attachLayoutRes() { @@ -116,20 +80,12 @@ protected BaseToolBar attachToolbar() { @SuppressLint({"CheckResult", "WrongConstant"}) protected void configToolBar() { - Utils.setPaddingForStatusBar(mAppBarLayout); mToolbar.setOnDoubleTapListener(this); mToolbar.setElevation(0); - mToolbar.setNavigationIcon(R.drawable.nav); - mToolbar.setNavigationContentDescription(R.string.acc_nav_menu); - mToolbar.getNavigationIcon().setTint(Theme.getColor(R.attr.icon_tint_color, this)); mToolbar.inflateMenu(R.menu.main_toolbar_menu);//设置右上角的填充菜单 - mToolbar.setNavigationOnClickListener(v -> { - if (mDrawerLayout.isDrawerOpen(Gravity.START)) { - mDrawerLayout.closeDrawer(Gravity.START); - } else { - mDrawerLayout.openDrawer(Gravity.START); - } - }); + mToolbar.setTitle(""); + mLogoView.setVisibility(View.VISIBLE); + mToolbar.setViewTileCenter(mLogoView); mToolbar.setOnMenuItemClickListener(item -> { if (item.getItemId() == R.id.action_search) { pushFragment(SearchFragment.newInstance()); @@ -150,242 +106,109 @@ public boolean onToolbarDoubleTaped() { return false; } - - private void refreshDayNightItem() { - mNightMenuItem.setTitle(DarkModelUtils.isAutoModeEnabled() ? "深色模式(自动)" : "深色模式"); - mNightSwitch.setChecked(DarkModelUtils.isDarkMode()); + private void changeTitle(int position) { + switch (position) { + case 0: + mToolbar.setTitle(""); + mLogoView.setVisibility(View.VISIBLE); + mToolbar.setViewTileCenter(mLogoView); + break; + case 1: + case 2: + case 3: + mLogoView.setVisibility(View.GONE); + mToolbar.setTitle(titles[position]); + mToolbar.setTileCenter(true); + break; + } } @Override protected void init() { isAlive = true; configToolBar(); + BottomNavigationViewHelper.setImageSize(mBottomNavigationView, + getResources().getDimensionPixelSize(R.dimen.bottom_navigation_view_icon_small_size), + getResources().getDimensionPixelSize(R.dimen.bottom_navigation_view_icon_small_size)); + mViewPager.setAdapter(new SlidePagerAdapter(getSupportFragmentManager())); + mViewPager.setOffscreenPageLimit(3); + mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - mNavigationView.setItemIconTintList(null); - mNavHeaderView = mNavigationView.getHeaderView(0); - mAvatarImg = mNavHeaderView.findViewById(R.id.avatar_img); - mUserNameTv = mNavHeaderView.findViewById(R.id.user_name_tv); - mCheckInBtn = mNavHeaderView.findViewById(R.id.check_in_progress_btn); - mAvatarImg.setOnClickListener(this); - mUserNameTv.setOnClickListener(this); - mCheckInBtn.setOnClickListener(this); - mNightMenuItem = mNavigationView.getMenu().findItem(R.id.day_night_item); - - mAvatarImg.setOnLongClickListener(v -> { - new ConfirmDialog.Builder(getActivity()) - .title("退出登录") - .msg("确定退出吗?") - .positiveText(R.string.ok, dialog -> { - UserUtils.clearLogin(); - Navigator.from(getActivity()) - .setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP) - .to(MainActivity.class).start(); - }) - .negativeText(R.string.cancel) - .build().show(); - return false; - }); + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - mNightSwitch = mNightMenuItem.getActionView().findViewById(R.id.drawer_switch); - updateDrawLayout(); - mNavigationView.setNavigationItemSelectedListener(item -> { - switch (item.getItemId()) { - case R.id.hot_nav_item: - Navigator.from(getContext()).to(DailyHotActivity.class).start(); - break; - case R.id.care_nav_item: - Navigator.from(getContext()).to(SpecialCareActivity.class).start(); - break; - case R.id.star_nav_item: - Navigator.from(getContext()).to(StarActivity.class).start(); - break; - case R.id.setting_nav_item: - Navigator.from(getContext()).to(Page.SETTING).start(); - break; - case R.id.faq_nav_item: - startActivity(new Intent(getContext(), UserManualActivity.class)); - break; - case R.id.create_nav_item: - if (UserUtils.notLoginAndProcessToLogin(false, getContext())) return true; - Navigator.from(getContext()).to(CreateTopicActivity.class).start(); - break; - case R.id.day_night_item: - onNightMenuItemClicked(DarkModelUtils.isDarkMode()); - break; } - delay(50, () -> mDrawerLayout.closeDrawer(Gravity.START, false)); - return true; - }); - - - Menu menu = mNavigationView.getMenu(); - for (int i = 0; i < menu.size(); i++) { - menu.getItem(i).getIcon().setTint(Theme.getColor(R.attr.icon_tint_color, this)); - } - mDrawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override - public void onDrawerOpened(View drawerView) { - updateDrawLayout(); + public void onPageSelected(int position) { + mBottomNavigationView.setSelectedItemId(bottomNavigationViewItemIds[position]); + changeTitle(position); } - }); - mAppBarLayout.addOnOffsetChangedListener(new AppBarStateChangeListener() { @Override - public void onStateChanged(AppBarLayout appBarLayout, AppBarStateChangeListener.State state) { - isAppbarExpanted = state == State.EXPANDED; + public void onPageScrollStateChanged(int state) { + } }); - - TAB_TITLES[0] = TabInfo.getSelectTab().title; - mViewPager.setAdapter(new SlidePagerAdapter(getSupportFragmentManager())); - mViewPager.setOffscreenPageLimit(2); - mSlidingTabLayout.setViewPager(mViewPager, TAB_TITLES); - mSlidingTabLayout.setOnTabSelectListener(this); - configNewsTabTitle(); - initCheckIn(); - - int index = getIntent().getIntExtra(TAB_INDEX, 0); - mSlidingTabLayout.setCurrentTab(index); - isAppbarExpanted = getIntent().getBooleanExtra(TOPIC_IS_APPBAR_EXPANDED, true); - mAppBarLayout.setExpanded(isAppbarExpanted); + mBottomNavigationView.setOnNavigationItemSelectedListener(item -> { + switch (item.getItemId()) { + case R.id.feed_page: + mViewPager.setCurrentItem(0); + break; + case R.id.explore_page: + mViewPager.setCurrentItem(1); + break; + case R.id.message_page: + mViewPager.setCurrentItem(2); + break; + case R.id.mine_page: + mViewPager.setCurrentItem(3); + break; + default: + return false; + } + return true; + }); + isAppbarExpanded = getIntent().getBooleanExtra(TOPIC_IS_APPBAR_EXPANDED, true); } @Override protected void reloadMode(int mode) { ActivityReloader.target(this) - .putExtra(TAB_INDEX, mSlidingTabLayout.getCurrentTab()) - .putExtra(TOPIC_IS_APPBAR_EXPANDED, isAppbarExpanted) + .putExtra(TOPIC_IS_APPBAR_EXPANDED, isAppbarExpanded) .putExtra(PAGE_ONE_DATA, mNewsFragment.getRestoreData()) - .putExtra(PAGE_TWO_DATA, mMsgFragment.getRestoreData()) - .putExtra(PAGE_THREE_DATA, mNavFragment.getRestoreData()) + .putExtra(PAGE_TWO_DATA, mNavFragment.getRestoreData()) + .putExtra(PAGE_THREE_DATA, mMsgFragment.getRestoreData()) .reload(); } - private void onNightMenuItemClicked(boolean isNightMode) { - int wanttedMode = isNightMode ? DarkModelUtils.DEFAULT_MODE : DarkModelUtils.DARK_MODE; - if (DarkModelUtils.isAutoModeEnabled()) { - new ConfirmDialog.Builder(MainActivity.this) - .title("要关闭自动切换模式吗?") - .msg("当前为自动切换模式,确定关闭自动切换吗") - .positiveText("关闭", dialog -> { - DarkModelUtils.saveEnableAutoSwitch(false); - DarkModelUtils.saveModeMannually(wanttedMode); - reloadMode(wanttedMode); - }).negativeText("暂时不用") - .build().show(); - } else { - mNightSwitch.toggle(); - DarkModelUtils.saveModeMannually(wanttedMode); - reloadMode(wanttedMode); - } - } - - private void configNewsTabTitle() { - int padding = ScaleUtils.dp(6f); - mSlidingTabLayout.setTitleViewVerticalPadding(0, padding); - mSlidingTabLayout.setTitleViewVerticalPadding(1, padding); - mSlidingTabLayout.setTitleViewVerticalPadding(2, padding); - mTab1View = mSlidingTabLayout.getTitleView(0); - mTab1View.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.animate_triangle_down, 0); - mTab1View.setCompoundDrawablePadding(ScaleUtils.dp(6)); - } - - private void initCheckIn() { - mCheckInPresenter = new CheckInPresenter(this); - mCheckInPresenter.start(); - } - - private void updateDrawLayout() { - UserInfo userInfo = UserUtils.getUserInfo(); - if (userInfo != null) { - mUserNameTv.setText(userInfo.getUserName()); - GlideApp.with(getContext()) - .load(userInfo.getAvatar()) - .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) - .placeholder(R.drawable.avatar_placeholder_drawable) - .into(mAvatarImg); - } else { - mUserNameTv.setText("请先登录"); - mAvatarImg.setImageResource(R.drawable.default_avatar_drawable); - } - refreshDayNightItem(); - } - @Override - public void onClick(View v) { - switch (v.getId()) { - case R.id.avatar_img: - case R.id.user_name_tv: - if (UserUtils.isLogin()) { - UserHomeActivity.open(UserUtils.getUserInfo().getUserName(), this, null, UserUtils.getUserInfo().getAvatar()); - } else { - Navigator.from(this).to(LoginActivity.class).start(); - } - mDrawerLayout.closeDrawers(); - break; - case R.id.check_in_progress_btn: - if (!UserUtils.isLogin()) { - toast("请先登录!"); - return; - } - if (mCheckInBtn.isNormal()) { - mCheckInPresenter.checkIn(true); - } else if (mCheckInBtn.isFinished()) { - toast("已连续签到" + mCheckInPresenter.checkInDays() + "天"); - } else { - toast("正在签到请稍后..."); - } - break; - } - } - - private int getCurrentTab() { - return mSlidingTabLayout.getCurrentTab(); - } + public void onClick(View v) { } @SuppressLint("WrongConstant") @Override public void onBackPressed() { - if (mDrawerLayout.isDrawerOpen(Gravity.START)) { - mDrawerLayout.closeDrawer(Gravity.START); - return; - } - - if (!isBackableEmpty()) { - super.onBackPressed(); - return; - } - - if (getCurrentTab() != 0) { - mSlidingTabLayout.setCurrentTab(0); - return; - } - - if (mFilterMenu != null && mFilterMenu.isShowing()) { - mFilterMenu.hide(); - return; - } + isBackableEmpty(); super.onBackPressed(); } @Override public void updateUnReadMsg(int position, int count) { - if (count <= 0) {//hide - mSlidingTabLayout.hideMsg(position); - } else { - mSlidingTabLayout.showMsg(position, count); - //config sliding msgview - float padding = getResources().getDimension(R.dimen.mediumTextSize) / 2f; - mSlidingTabLayout.setMsgMargin(1, padding * 0.92f, padding * 0.28f); - MsgView msgView = mSlidingTabLayout.getMsgView(1); - float textSize = getResources().getDimension(R.dimen.tinyTextSize); - msgView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); - RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) msgView.getLayoutParams(); - lp.width = Math.round(textSize * (count + "").length() * 1.5f); - lp.height = Math.round(textSize * 1.5f); - msgView.setLayoutParams(lp); - } +// if (count <= 0) {//hide +// mSlidingTabLayout.hideMsg(position); +// } else { +// mSlidingTabLayout.showMsg(position, count); +// //config sliding msgview +// float padding = getResources().getDimension(R.dimen.mediumTextSize) / 2f; +// mSlidingTabLayout.setMsgMargin(1, padding * 0.92f, padding * 0.28f); +// MsgView msgView = mSlidingTabLayout.getMsgView(1); +// float textSize = getResources().getDimension(R.dimen.tinyTextSize); +// msgView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); +// RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) msgView.getLayoutParams(); +// lp.width = Math.round(textSize * (count + "").length() * 1.5f); +// lp.height = Math.round(textSize * 1.5f); +// msgView.setLayoutParams(lp); +// } } @Override @@ -402,48 +225,20 @@ protected void onDestroy() { } private Fragment getCurrentFragment() { - int pos = getCurrentTab(); + int pos = mViewPager.getCurrentItem(); switch (pos) { case 0: return mNewsFragment; case 1: - return mMsgFragment; - case 2: return mNavFragment; + case 2: + return mMsgFragment; + case 3: + return mMineFragment; } return null; } - @Override - public FollowProgressBtn checkInBtn() { - return mCheckInBtn; - } - - @Override - public void onTabSelect(int position) { - L.d("onTabSelect"); - if (position == 0) { - mTab1View.getCompoundDrawables()[2].setTint(Theme.getColor(R.attr.tablayout_selected_color, this)); - } else { - mTab1View.getCompoundDrawables()[2].setTint(Theme.getColor(R.attr.tablayout_unselected_color, this)); - if (mFilterMenu != null && mFilterMenu.isShowing()) { - mFilterMenu.hide(); - } - } - } - - @Override - public void onTabReselect(int position) { - L.d("onTabReSelect"); - if (position == 0) { - if (mFilterMenu == null) { - mFilterMenu = new HomeFilterMenu(mTabMenuContainer, mTab1View); - mFilterMenu.setOnItemClickListner(this); - } - mFilterMenu.toggle(); - } - } - @Override public void onMenuItemClicked(TabInfo tabInfo) { ChangeTabTypeDelegate delegate = mNewsFragment; @@ -479,14 +274,17 @@ public Fragment getItem(int position) { break; case 1: restoreData = (BaseHomeFragment.RestoreData) getIntent().getSerializableExtra(PAGE_TWO_DATA); - MsgFragment msgFragment = MsgFragment.newInstance(restoreData); - msgFragment.setUpdateUnReadMsgDelegate(MainActivity.this); - fragment = msgFragment; + fragment = NodesNavFragment.newInstance(restoreData); break; case 2: restoreData = (BaseHomeFragment.RestoreData) getIntent().getSerializableExtra(PAGE_THREE_DATA); - fragment = NodesNavFragment.newInstance(restoreData); + MsgFragment msgFragment = MsgFragment.newInstance(restoreData); + msgFragment.setUpdateUnReadMsgDelegate(MainActivity.this); + fragment = msgFragment; break; + case 3: + restoreData = (BaseHomeFragment.RestoreData) getIntent().getSerializableExtra(PAGE_FOUR_DATA); + fragment = MineFragment.newInstance(restoreData); } return fragment; } @@ -499,20 +297,21 @@ public Object instantiateItem(ViewGroup container, int position) { mNewsFragment = (NewsFragment) fragment; break; case 1: - mMsgFragment = (MsgFragment) fragment; + mNavFragment = (NodesNavFragment) fragment; break; case 2: - mNavFragment = (NodesNavFragment) fragment; + mMsgFragment = (MsgFragment) fragment; break; + case 3: + mMineFragment = (MineFragment) fragment; } return fragment; } @Override public int getCount() { - return TAB_TITLES.length; + return titles.length; } - } - ; + }; } diff --git a/app/src/main/java/me/ghui/v2er/module/home/MineContract.java b/app/src/main/java/me/ghui/v2er/module/home/MineContract.java new file mode 100644 index 00000000..ed7be974 --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/module/home/MineContract.java @@ -0,0 +1,20 @@ +package me.ghui.v2er.module.home; + +import me.ghui.v2er.module.base.BaseContract; +import me.ghui.v2er.network.bean.NotificationInfo; + +/** + * Created by ghui on 10/05/2017. + */ + +public class MineContract { + + public interface IView extends BaseContract.IView { +// void fillView(NotificationInfo info, boolean isLoadMore); + } + + public interface IPresenter extends BaseContract.IPresenter { + + } + +} diff --git a/app/src/main/java/me/ghui/v2er/module/home/MineFragment.java b/app/src/main/java/me/ghui/v2er/module/home/MineFragment.java new file mode 100644 index 00000000..f5514f45 --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/module/home/MineFragment.java @@ -0,0 +1,204 @@ +package me.ghui.v2er.module.home; + +import android.os.Bundle; + +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.bumptech.glide.request.target.Target; + +import javax.inject.Inject; + +import butterknife.BindView; +import de.hdodenhof.circleimageview.CircleImageView; +import me.ghui.v2er.R; +import me.ghui.v2er.adapter.base.MultiItemTypeAdapter; +import me.ghui.v2er.adapter.base.ViewHolder; +import me.ghui.v2er.general.GlideApp; +import me.ghui.v2er.general.Navigator; +import me.ghui.v2er.general.Page; +import me.ghui.v2er.injector.component.DaggerMineComponent; +import me.ghui.v2er.injector.module.MineModule; +import me.ghui.v2er.module.create.CreateTopicActivity; +import me.ghui.v2er.module.drawer.care.SpecialCareActivity; +import me.ghui.v2er.module.drawer.star.StarActivity; +import me.ghui.v2er.module.login.LoginActivity; +import me.ghui.v2er.module.user.UserHomeActivity; +import me.ghui.v2er.network.bean.NewsInfo; +import me.ghui.v2er.network.bean.NotificationInfo; +import me.ghui.v2er.network.bean.UserInfo; +import me.ghui.v2er.util.UserUtils; +import me.ghui.v2er.widget.BaseRecyclerView; +import me.ghui.v2er.widget.LoadMoreRecyclerView; +import me.ghui.v2er.widget.SectionItemView; + +/** + * 首页我的页面 + */ +public class MineFragment extends BaseHomeFragment implements MineContract.IView, + View.OnClickListener, SectionItemView.OnSectionClickListener { + + @BindView(R.id.mine_root_layout) + ConstraintLayout mRootLayout; + @BindView(R.id.mine_avatar_img) + CircleImageView mAvatarImage; + @BindView(R.id.mine_username_button) + Button mUserNameButton; + @BindView(R.id.mine_user_info_page_button) + Button mUserInfoPageButton; + + @BindView(R.id.mine_sec_post) + SectionItemView mSecPost; + @BindView(R.id.mine_sec_themes) + SectionItemView mSecThemes; + @BindView(R.id.mine_sec_bookmark) + SectionItemView mSecBookmark; + @BindView(R.id.mine_sec_focus) + SectionItemView mSecFocus; + @BindView(R.id.mine_sec_settings) + SectionItemView mSecSettings; + + public static MineFragment newInstance(BaseHomeFragment.RestoreData restoreData) { + Bundle args = new Bundle(); + if (restoreData != null) { + args.putSerializable(KEY_DATA, restoreData); + } + MineFragment fragment = new MineFragment(); + fragment.setArguments(args); + return fragment; + } + + @Override + protected int attachLayoutRes() { + return R.layout.fragment_mine; + } + + @Override + protected void startInject() { + DaggerMineComponent.builder() + .appComponent(getAppComponent()) + .mineModule(new MineModule(this)) + .build() + .inject(this); + } + + private UserInfo userInfo; + private void initDisplayUserName() { + userInfo = UserUtils.getUserInfo(); + if (userInfo == null) { + mUserNameButton.setContentDescription(getText(R.string.please_login_first)); + mUserNameButton.setText(R.string.please_login_first); + mAvatarImage.setImageResource(R.drawable.default_avatar_drawable); + } else { + mUserNameButton.setContentDescription(userInfo.getUserName()); + mUserNameButton.setText(userInfo.getUserName()); + if (getContext() != null) { + GlideApp.with(getContext()) + .load(userInfo.getAvatar()) + .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) + .placeholder(R.drawable.avatar_placeholder_drawable) + .into(mAvatarImage); + } + } + } + + @Override + protected void init() { + hideLoading(); + mRootLayout.setOnClickListener(this); + mAvatarImage.setOnClickListener(this); + mUserNameButton.setOnClickListener(this); + mUserInfoPageButton.setOnClickListener(this); + mSecPost.setOnSectionClickListener(this); + mSecThemes.setOnSectionClickListener(this); + mSecBookmark.setOnSectionClickListener(this); + mSecFocus.setOnSectionClickListener(this); + mSecSettings.setOnSectionClickListener(this); + initDisplayUserName(); + } + + private void goToUserInfoPage() { + if (UserUtils.isLogin()) { + if (getContext() != null) { + UserHomeActivity.open(userInfo.getUserName(), getContext(), + userInfo.getAvatar(), mAvatarImage, mUserNameButton); + } + } else { + if (getContext() != null) { + Navigator.from(getContext()).to(LoginActivity.class).start(); + } + } + } + + /** + * 发帖 + */ + private void goToPost() { + if (UserUtils.notLoginAndProcessToLogin(false, getContext())) { + return; + } + if (UserUtils.isLogin()) { + Navigator.from(getContext()).to(CreateTopicActivity.class).start(); + } + } + + /** + * 收藏 + */ + private void goToBookmark() { + if (UserUtils.notLoginAndProcessToLogin(false, getContext())) { + return; + } + if (UserUtils.isLogin()) { + Navigator.from(getContext()).to(StarActivity.class).start(); + } + } + + /** + * 关注 + */ + private void goToFocus() { + if (UserUtils.notLoginAndProcessToLogin(false, getContext())) { + return; + } + if (UserUtils.isLogin()) { + Navigator.from(getContext()).to(SpecialCareActivity.class).start(); + } + } + + /** + * 设置 + */ + private void goToSetting() { + Navigator.from(getContext()).to(Page.SETTING).start(); + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.mine_root_layout: + case R.id.mine_avatar_img: + case R.id.mine_username_button: + case R.id.mine_user_info_page_button: + goToUserInfoPage(); + break; + case R.id.mine_sec_post: + goToPost(); + break; + case R.id.mine_sec_bookmark: + goToBookmark(); + break; + case R.id.mine_sec_focus: + goToFocus(); + break; + case R.id.mine_sec_settings: + goToSetting(); + break; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/me/ghui/v2er/module/home/MinePresenter.java b/app/src/main/java/me/ghui/v2er/module/home/MinePresenter.java new file mode 100644 index 00000000..caab1ae7 --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/module/home/MinePresenter.java @@ -0,0 +1,16 @@ +package me.ghui.v2er.module.home; + +public class MinePresenter implements MineContract.IPresenter { + + private MineContract.IView mView; + + public MinePresenter(MineContract.IView mView) { + this.mView = mView; + } + + @Override + public void start() { + + } + +} diff --git a/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java b/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java index f417ef28..81be2837 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/home/NewsFragment.java @@ -124,6 +124,19 @@ protected void init() { protected void lazyLoad() { if (mNewsInfo == null) { super.lazyLoad(); + } else { + RestoreData restoreData = getRestoreData(); + if (restoreData != null) { + mNewsInfo = restoreData.info; + mRecyclerView.setWillLoadPage(restoreData.page); + if (mNewsInfo.getItems() != null) { + fillView(mNewsInfo, false); + post(() -> mLayoutManager.scrollToPositionWithOffset(restoreData.scrollPos, restoreData.scrollOffset)); + hideLoading(); + } else { + mPresenter.start(); + } + } } } diff --git a/app/src/main/java/me/ghui/v2er/module/home/SearchFragment.java b/app/src/main/java/me/ghui/v2er/module/home/SearchFragment.java index 9713b435..75be42cf 100644 --- a/app/src/main/java/me/ghui/v2er/module/home/SearchFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/home/SearchFragment.java @@ -86,7 +86,6 @@ protected boolean showLoadingOnCreateView() { @Override protected void init() { - Utils.setPaddingForStatusBar(mSearchRootView); mCardView.setCardBackgroundColor(Theme.getColor(R.attr.dialog_bg_color, getContext())); mResultRecyV.addDivider(DarkModelUtils.isDarkMode() ? 0XFF000000 : 0XFFF5F5F5, 6); mResultRecyV.setLayoutManager(new LinearLayoutManager(getContext())); diff --git a/app/src/main/java/me/ghui/v2er/module/login/LoginActivity.java b/app/src/main/java/me/ghui/v2er/module/login/LoginActivity.java index 8ca8a0f0..69ceccd2 100644 --- a/app/src/main/java/me/ghui/v2er/module/login/LoginActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/login/LoginActivity.java @@ -77,7 +77,6 @@ protected void startInject() { @Override protected void init() { super.init(); - Utils.setPaddingForNavbar(mRootView); } @Override @@ -88,7 +87,6 @@ protected void reloadMode(int mode) { @Override protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); - Utils.setPaddingForStatusBar(toolBar); toolBar.setElevation(0); toolBar.inflateMenu(R.menu.login_toolbar_menu); toolBar.setOnMenuItemClickListener(item -> { diff --git a/app/src/main/java/me/ghui/v2er/module/node/NodeTopicActivity.java b/app/src/main/java/me/ghui/v2er/module/node/NodeTopicActivity.java index 88e2de94..19ba7496 100644 --- a/app/src/main/java/me/ghui/v2er/module/node/NodeTopicActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/node/NodeTopicActivity.java @@ -162,6 +162,7 @@ protected int attachLayoutRes() { @Override protected BaseToolBar attachToolbar() { + displayStatusBarArea(false); return null; } @@ -185,11 +186,19 @@ protected boolean supportShareElement() { return true; } + @Override + protected void configToolBar(BaseToolBar toolBar) { + super.configToolBar(toolBar); + if (mToolbar != null) { + + } + } + @Override protected void init() { getWindow().setStatusBarColor(Color.TRANSPARENT); - Utils.setPaddingForStatusBar(mToolbar); setEnterSharedElementCallback(mCallback); + mToolbar.displayHomeAsUpButton(this); mToolbar.setOnDoubleTapListener(this); mToolbar.inflateMenu(R.menu.node_info_toolbar_menu); mLoveMenuItem = mToolbar.getMenu().findItem(R.id.action_star); @@ -422,7 +431,7 @@ public void afterUnIgnoreNode() { private void toggleStar(boolean isStared) { mLoveMenuItem.setIcon(isStared ? - R.drawable.ic_star_selected : R.drawable.ic_star_normal); + R.drawable.ic_bookmarked : R.drawable.ic_bookmark); mLoveMenuItem.getIcon().setTint(Theme.getColor(R.attr.icon_tint_color, this)); if (isStared) { mStarBtn.setStatus(FollowProgressBtn.FINISHED, "已收藏", R.drawable.progress_button_done_icon); diff --git a/app/src/main/java/me/ghui/v2er/module/settings/ContactFragment.java b/app/src/main/java/me/ghui/v2er/module/settings/ContactFragment.java index 6c268f98..b5adc819 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/ContactFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/ContactFragment.java @@ -44,7 +44,6 @@ public void onActivityCreated(Bundle savedInstanceState) { ListView list = rootView.findViewById(android.R.id.list); if (list != null) { // list.setDivider(getActivity().getDrawable(R.drawable.common_divider)); - Utils.setPaddingForNavbar(list); } } diff --git a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java index ec0942bc..53b41878 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/SettingFragment.java @@ -56,6 +56,7 @@ public void onCreate(Bundle savedInstanceState) { loginPreference = findPreference(getString(R.string.pref_key_value_toggle_log)); loginPreference.setOnPreferenceClickListener(this); loginPreference.setTitle(UserUtils.isLogin() ? R.string.logout_str : R.string.login_str); + findPreference(getString(R.string.pref_key_help_and_feedback)).setOnPreferenceClickListener(this); findPreference(getString(R.string.pref_key_auto_checkin)).setOnPreferenceClickListener(this); findPreference(getString(R.string.pref_key_highlight_topic_owner_reply_item)).setOnPreferenceClickListener(this); findPreference(getString(R.string.pref_key_is_scan_in_reverse)).setOnPreferenceClickListener(this::onPreferenceClick); @@ -85,8 +86,6 @@ public void onActivityCreated(Bundle savedInstanceState) { ListView list = rootView.findViewById(android.R.id.list); if (list != null) { list.setDivider(null); -// list.setDivider(getActivity().getDrawable(R.drawable.common_divider)); - Utils.setPaddingForNavbar(list); } } @@ -102,6 +101,9 @@ public boolean onPreferenceClick(Preference preference) { Voast.show("成功清理" + size + "缓存"); } return true; + } else if (key.equals(getString(R.string.pref_key_help_and_feedback))) { + startActivity(new Intent(getContext(), UserManualActivity.class)); + return true; } else if (key.equals(getString(R.string.pref_key_check_update))) { Utils.openStorePage(); return true; diff --git a/app/src/main/java/me/ghui/v2er/module/settings/UserManualActivity.java b/app/src/main/java/me/ghui/v2er/module/settings/UserManualActivity.java index 304c9e85..d4015e36 100644 --- a/app/src/main/java/me/ghui/v2er/module/settings/UserManualActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/settings/UserManualActivity.java @@ -22,8 +22,6 @@ protected int attachLayoutRes() { @Override protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); - Utils.setPaddingForStatusBar(toolBar); - Utils.setPaddingForNavbar(mHtmlView); } @Override diff --git a/app/src/main/java/me/ghui/v2er/module/topic/TopicActivity.java b/app/src/main/java/me/ghui/v2er/module/topic/TopicActivity.java index 01bb777d..7d13e972 100644 --- a/app/src/main/java/me/ghui/v2er/module/topic/TopicActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/topic/TopicActivity.java @@ -209,122 +209,124 @@ protected void parseExtras(Intent intent) { @Override protected void configToolBar(BaseToolBar toolBar) { super.configToolBar(toolBar); - Utils.setPaddingForStatusBar(toolBar); - mToolbar.inflateMenu(R.menu.topic_info_toolbar_menu); - Menu menu = mToolbar.getMenu(); - mLoveMenuItem = menu.findItem(R.id.action_star); - mThxMenuItem = menu.findItem(R.id.action_thx); - mAppendItem = menu.findItem(R.id.action_append); - mFadeItem = menu.findItem(R.id.action_fade); - mStickyItem = menu.findItem(R.id.action_sticky); - mReportMenuItem = menu.findItem(R.id.action_report); - MenuItem replyMenuItem = menu.findItem(R.id.action_reply); - mIsHideReplyBtn = Pref.readBool(R.string.pref_key_hide_reply_btn); - replyMenuItem.setVisible(mIsHideReplyBtn); - MenuItem scanOrderMenuItem = menu.findItem(R.id.action_scan_order); - scanOrderMenuItem.setTitle(mIsScanInOrder ? "顺序浏览" : "逆序浏览"); - mToolbar.setOnMenuItemClickListener(item -> { - if (mTopicInfo == null) { - if (item.getItemId() == R.id.action_open_in_browser) { - String topicLink = Utils.generateTopicLinkById(mTopicId); - Utils.openInBrowser(topicLink, this); - } else { - toast("请等到加载完成"); - } - return true; - } - TopicInfo.HeaderInfo headerInfo = mTopicInfo.getHeaderInfo(); - - switch (item.getItemId()) { - case R.id.action_star: - if (headerInfo.hadStared()) { - mPresenter.unStarTopic(mTopicId, mTopicInfo.getOnce()); - } else { - mPresenter.starTopic(mTopicId, mTopicInfo.getOnce()); - } - break; - case R.id.action_append: - AppendTopicActivity.open(mTopicId, TopicActivity.this); - break; - case R.id.action_thx: - if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; - if (mTopicInfo.getHeaderInfo().isSelf()) { - toast("自己不能感谢自己"); - return false; - } - if (!headerInfo.canSendThanks()) { - toast("感谢发送失败,可能因为您刚注册不久"); - return true; - } - if (!headerInfo.hadThanked()) { - mPresenter.thxCreator(mTopicId, getOnce()); + if (mToolbar != null) { + mToolbar.displayHomeAsUpButton(this); + mToolbar.inflateMenu(R.menu.topic_info_toolbar_menu); + Menu menu = mToolbar.getMenu(); + mLoveMenuItem = menu.findItem(R.id.action_star); + mThxMenuItem = menu.findItem(R.id.action_thx); + mAppendItem = menu.findItem(R.id.action_append); + mFadeItem = menu.findItem(R.id.action_fade); + mStickyItem = menu.findItem(R.id.action_sticky); + mReportMenuItem = menu.findItem(R.id.action_report); + MenuItem replyMenuItem = menu.findItem(R.id.action_reply); + mIsHideReplyBtn = Pref.readBool(R.string.pref_key_hide_reply_btn); + replyMenuItem.setVisible(mIsHideReplyBtn); + MenuItem scanOrderMenuItem = menu.findItem(R.id.action_scan_order); + scanOrderMenuItem.setTitle(mIsScanInOrder ? "顺序浏览" : "逆序浏览"); + mToolbar.setOnMenuItemClickListener(item -> { + if (mTopicInfo == null) { + if (item.getItemId() == R.id.action_open_in_browser) { + String topicLink = Utils.generateTopicLinkById(mTopicId); + Utils.openInBrowser(topicLink, this); } else { - toast(R.string.already_thx_cannot_return); - return true; + toast("请等到加载完成"); } - break; - case R.id.action_block: - if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; - new ConfirmDialog.Builder(getActivity()) - .msg("确定忽略此主题吗?") - .positiveText(R.string.ok, dialog -> mPresenter.ignoreTopic(mTopicId, mTopicInfo.getOnce())) - .negativeText(R.string.cancel) - .build().show(); - break; - case R.id.action_report: - if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; - new ConfirmDialog.Builder(getActivity()) - .msg("确定要举报这个主题吗?") - .positiveText(R.string.ok, dialog -> mPresenter.reportTopic()) - .negativeText(R.string.cancel) - .build().show(); - break; - case R.id.action_sticky: - if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; - new ConfirmDialog.Builder(getActivity()) - .msg("你确认要将此主题置顶 10 分钟?该操作价格为 200 铜币。") - .positiveText(R.string.ok, dialog -> mPresenter.stickyTopic()) - .negativeText(R.string.cancel) - .build().show(); - break; - case R.id.action_fade: - if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; - new ConfirmDialog.Builder(getActivity()) - .msg("你确认要将此主题下沉 1 天?") - .positiveText(R.string.ok, dialog -> mPresenter.fadeTopic()) - .negativeText(R.string.cancel) - .build().show(); - break; - case R.id.action_share: - ShareManager.ShareData shareData = new ShareManager.ShareData.Builder(headerInfo.getTitle()) - .content(Vtml.fromHtml(mTopicInfo.getContentInfo().getFormattedHtml()).toString()) - .link(UriUtils.topicLink(mTopicId)) - .img(headerInfo.getAvatar()) - .build(); - ShareManager shareManager = new ShareManager(shareData, this); - shareManager.showShareDialog(); - break; - case R.id.action_open_in_browser: + return true; + } + TopicInfo.HeaderInfo headerInfo = mTopicInfo.getHeaderInfo(); + + switch (item.getItemId()) { + case R.id.action_star: + if (headerInfo.hadStared()) { + mPresenter.unStarTopic(mTopicId, mTopicInfo.getOnce()); + } else { + mPresenter.starTopic(mTopicId, mTopicInfo.getOnce()); + } + break; + case R.id.action_append: + AppendTopicActivity.open(mTopicId, TopicActivity.this); + break; + case R.id.action_thx: + if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; + if (mTopicInfo.getHeaderInfo().isSelf()) { + toast("自己不能感谢自己"); + return false; + } + if (!headerInfo.canSendThanks()) { + toast("感谢发送失败,可能因为您刚注册不久"); + return true; + } + if (!headerInfo.hadThanked()) { + mPresenter.thxCreator(mTopicId, getOnce()); + } else { + toast(R.string.already_thx_cannot_return); + return true; + } + break; + case R.id.action_block: + if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; + new ConfirmDialog.Builder(getActivity()) + .msg("确定忽略此主题吗?") + .positiveText(R.string.ok, dialog -> mPresenter.ignoreTopic(mTopicId, mTopicInfo.getOnce())) + .negativeText(R.string.cancel) + .build().show(); + break; + case R.id.action_report: + if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; + new ConfirmDialog.Builder(getActivity()) + .msg("确定要举报这个主题吗?") + .positiveText(R.string.ok, dialog -> mPresenter.reportTopic()) + .negativeText(R.string.cancel) + .build().show(); + break; + case R.id.action_sticky: + if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; + new ConfirmDialog.Builder(getActivity()) + .msg("你确认要将此主题置顶 10 分钟?该操作价格为 200 铜币。") + .positiveText(R.string.ok, dialog -> mPresenter.stickyTopic()) + .negativeText(R.string.cancel) + .build().show(); + break; + case R.id.action_fade: + if (UserUtils.notLoginAndProcessToLogin(false, this)) return false; + new ConfirmDialog.Builder(getActivity()) + .msg("你确认要将此主题下沉 1 天?") + .positiveText(R.string.ok, dialog -> mPresenter.fadeTopic()) + .negativeText(R.string.cancel) + .build().show(); + break; + case R.id.action_share: + ShareManager.ShareData shareData = new ShareManager.ShareData.Builder(headerInfo.getTitle()) + .content(Vtml.fromHtml(mTopicInfo.getContentInfo().getFormattedHtml()).toString()) + .link(UriUtils.topicLink(mTopicId)) + .img(headerInfo.getAvatar()) + .build(); + ShareManager shareManager = new ShareManager(shareData, this); + shareManager.showShareDialog(); + break; + case R.id.action_open_in_browser: // Utils.copyToClipboard(this, mTopicInfo.getTopicLink()); // toast("链接已拷贝成功"); - Utils.openInBrowser(mTopicInfo.getTopicLink(), this); - break; - case R.id.action_reply: - animateEditInnerWrapper(true); - break; - case R.id.action_scan_order: - // reload - mIsScanInOrder = !mIsScanInOrder; - scanOrderMenuItem.setTitle(mIsScanInOrder ? "顺序浏览" : "逆序浏览"); - Pref.saveBool(R.string.pref_key_is_scan_in_reverse, !mIsScanInOrder); - mLoadMoreRecyclerView.setLoadOrder(mIsScanInOrder); - // 重新加载 - loadFromStart(); - showLoading(); - break; - } - return true; - }); + Utils.openInBrowser(mTopicInfo.getTopicLink(), this); + break; + case R.id.action_reply: + animateEditInnerWrapper(true); + break; + case R.id.action_scan_order: + // reload + mIsScanInOrder = !mIsScanInOrder; + scanOrderMenuItem.setTitle(mIsScanInOrder ? "顺序浏览" : "逆序浏览"); + Pref.saveBool(R.string.pref_key_is_scan_in_reverse, !mIsScanInOrder); + mLoadMoreRecyclerView.setLoadOrder(mIsScanInOrder); + // 重新加载 + loadFromStart(); + showLoading(); + break; + } + return true; + }); + } } @@ -384,7 +386,6 @@ protected void reloadMode(int mode) { @Override protected void init() { AndroidBug5497Workaround.assistActivity(this); - Utils.setPaddingForNavbar(mReplyLayout); setEnterSharedElementCallback(mCallback); setFirstLoadingDelay(300); shareElementAnimation(); @@ -775,7 +776,7 @@ public void onAnimationCancel(Animator animation) { private void updateStarStatus(boolean isStared, boolean needUpdateData) { mLoveMenuItem.setIcon(isStared ? - R.drawable.ic_star_selected : R.drawable.ic_star_normal); + R.drawable.ic_bookmarked : R.drawable.ic_bookmark); mLoveMenuItem.getIcon().setTint(Theme.getColor(R.attr.icon_tint_color, this)); if (needUpdateData) { mTopicInfo.getHeaderInfo().updateStarStatus(isStared); @@ -913,7 +914,6 @@ public void onKeyboardShown() { @Override public void onKeyboardHidden() { L.d("onKeyboardHidden"); - Utils.setPaddingForNavbar(mReplyLayout); } @Override diff --git a/app/src/main/java/me/ghui/v2er/module/user/UserHomeActivity.java b/app/src/main/java/me/ghui/v2er/module/user/UserHomeActivity.java index 06ff6663..0cf08629 100644 --- a/app/src/main/java/me/ghui/v2er/module/user/UserHomeActivity.java +++ b/app/src/main/java/me/ghui/v2er/module/user/UserHomeActivity.java @@ -2,6 +2,7 @@ import android.app.SharedElementCallback; import android.content.Context; +import android.content.Entity; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.Drawable; @@ -22,6 +23,9 @@ import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -118,6 +122,35 @@ public void onMapSharedElements(List names, Map sharedElem private int mAppBarMaxOffset; private LinearLayoutManager mLayoutManager; + public static void open(String userName, Context context, String avatar, View... sourceViews) { + Navigator navigator = Navigator.from(context) + .to(UserHomeActivity.class) + .putExtra(UserHomeActivity.USER_NAME_KEY, userName) + .putExtra(UserHomeActivity.USER_AVATAR_KEY, avatar); + List sourceViewList = new ArrayList<>(sourceViews.length); + Collections.addAll(sourceViewList, sourceViews); + if (sourceViews.length > 0) { + Iterator sourceViewIterator = sourceViewList.iterator(); + while (sourceViewIterator.hasNext()) { + View sourceView = sourceViewIterator.next(); + if (sourceView instanceof ImageView) { + ImageView imgView = (ImageView) sourceView; + if (ViewUtils.isSameImgRes(imgView, R.drawable.avatar_placeholder_drawable) || imgView.getDrawable() == null) { + sourceViewIterator.remove(); + } + } + navigator.putExtra(KEY(sourceView.getTransitionName()+"_key"), + sourceView.getTransitionName()); + } + } + if (sourceViewList.size() > 0) { + View[] shareViews = new View[sourceViewList.size()]; + sourceViewList.toArray(shareViews); + navigator.shareElement(shareViews); + } + navigator.start(); + } + public static void open(String userName, Context context, View sourceView, String avatar) { if (sourceView != null && sourceView instanceof ImageView) { ImageView imgview = (ImageView) sourceView; @@ -141,9 +174,15 @@ protected int attachLayoutRes() { @Override protected BaseToolBar attachToolbar() { + displayStatusBarArea(false); return null; } + @Override + protected void configToolBar(BaseToolBar toolBar) { + super.configToolBar(toolBar); + } + @Override protected void parseExtras(Intent intent) { mUserName = intent.getStringExtra(USER_NAME_KEY); @@ -181,7 +220,6 @@ public void finishAfterTransition() { protected void init() { getWindow().setStatusBarColor(Color.TRANSPARENT); mAvatarImg.setTransitionName(mTransitionName); - Utils.setPaddingForStatusBar(mToolbar); setEnterSharedElementCallback(mCallback); mToolbar.setOnDoubleTapListener(this); mToolbar.setNavigationOnClickListener(view -> onBackPressed()); diff --git a/app/src/main/java/me/ghui/v2er/network/GeneralConsumer.java b/app/src/main/java/me/ghui/v2er/network/GeneralConsumer.java index 2a5202ed..416566e2 100644 --- a/app/src/main/java/me/ghui/v2er/network/GeneralConsumer.java +++ b/app/src/main/java/me/ghui/v2er/network/GeneralConsumer.java @@ -55,53 +55,55 @@ public void onNext(T t) { 3. no premission to open the page */ GeneralError generalError = new GeneralError(ResultCode.NETWORK_ERROR, "Unknown Error"); - String response = t.getResponse(); - generalError.setResponse(response); - Observable.just(response) - .compose(RxUtils.io_main()) - .map(s -> { - BaseInfo resultInfo = APIService.fruit().fromHtml(s, LoginParam.class); - if (resultInfo == null) return null; - if (!resultInfo.isValid()) { - resultInfo = APIService.fruit().fromHtml(s, NewsInfo.class); - } - if (!resultInfo.isValid()) { - resultInfo = APIService.fruit().fromHtml(s, TwoStepLoginInfo.class); - } - // 31/07/2017 More tries... - return resultInfo; - }) - .subscribe(new BaseConsumer() { - @Override - public void onConsume(BaseInfo resultInfo) { - if (resultInfo == null || !resultInfo.isValid()) { - onGeneralError(generalError); - return; + if (t.getResponse() != null) { + String response = t.getResponse(); + generalError.setResponse(response); + Observable.just(response) + .compose(RxUtils.io_main()) + .map(s -> { + BaseInfo resultInfo = APIService.fruit().fromHtml(s, LoginParam.class); + if (resultInfo == null) return null; + if (!resultInfo.isValid()) { + resultInfo = APIService.fruit().fromHtml(s, NewsInfo.class); + } + if (!resultInfo.isValid()) { + resultInfo = APIService.fruit().fromHtml(s, TwoStepLoginInfo.class); } - if (resultInfo instanceof LoginParam) { - if (UserUtils.isLogin()) { - generalError.setErrorCode(ResultCode.LOGIN_EXPIRED); - generalError.setMessage("登录已过期,请重新登录"); - UserUtils.clearLogin(); - } else { - generalError.setErrorCode(ResultCode.LOGIN_NEEDED); - generalError.setMessage("需要您先去登录"); + // 31/07/2017 More tries... + return resultInfo; + }) + .subscribe(new BaseConsumer() { + @Override + public void onConsume(BaseInfo resultInfo) { + if (resultInfo == null || !resultInfo.isValid()) { + onGeneralError(generalError); + return; + } + if (resultInfo instanceof LoginParam) { + if (UserUtils.isLogin()) { + generalError.setErrorCode(ResultCode.LOGIN_EXPIRED); + generalError.setMessage("登录已过期,请重新登录"); + UserUtils.clearLogin(); + } else { + generalError.setErrorCode(ResultCode.LOGIN_NEEDED); + generalError.setMessage("需要您先去登录"); + } + } else if (resultInfo instanceof NewsInfo) { + generalError.setErrorCode(ResultCode.REDIRECT_TO_HOME); + generalError.setMessage("Redirecting to home"); + } else if (resultInfo instanceof TwoStepLoginInfo) { + generalError.setErrorCode(ResultCode.LOGIN_TWO_STEP); + generalError.setMessage("Two Step Login"); } - } else if (resultInfo instanceof NewsInfo) { - generalError.setErrorCode(ResultCode.REDIRECT_TO_HOME); - generalError.setMessage("Redirecting to home"); - } else if (resultInfo instanceof TwoStepLoginInfo) { - generalError.setErrorCode(ResultCode.LOGIN_TWO_STEP); - generalError.setMessage("Two Step Login"); + onGeneralError(generalError); } - onGeneralError(generalError); - } - @Override - public void onError(Throwable e) { - onGeneralError(e); - } - }); + @Override + public void onError(Throwable e) { + onGeneralError(e); + } + }); + } } } diff --git a/app/src/main/java/me/ghui/v2er/widget/BaseToolBar.java b/app/src/main/java/me/ghui/v2er/widget/BaseToolBar.java index ab65fd32..29a65012 100644 --- a/app/src/main/java/me/ghui/v2er/widget/BaseToolBar.java +++ b/app/src/main/java/me/ghui/v2er/widget/BaseToolBar.java @@ -1,14 +1,29 @@ package me.ghui.v2er.widget; +import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; import android.graphics.drawable.Drawable; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.TintTypedArray; import androidx.appcompat.widget.Toolbar; import android.util.AttributeSet; +import android.util.Log; import android.view.GestureDetector; +import android.view.Gravity; import android.view.Menu; import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ActionMenuView; +import android.widget.ImageButton; +import android.widget.TextView; +import com.google.android.material.appbar.AppBarLayout; + +import me.ghui.v2er.util.ScaleUtils; import me.ghui.v2er.util.Theme; import me.ghui.v2er.R; @@ -17,6 +32,12 @@ */ public class BaseToolBar extends Toolbar { + + static final int MIN_CELL_SIZE = 56; // dips + static final int MIN_NAVI_ICON_SIZE = 48; // dips + static final int GENERATED_ITEM_PADDING = 4; // dips + static final int GENERATED_ITEM_MARGIN = 16; // dips + public BaseToolBar(Context context) { super(context); init(); @@ -32,12 +53,113 @@ public BaseToolBar(Context context, @Nullable AttributeSet attrs, int defStyleAt init(); } - private void init() { - setContentInsetStartWithNavigation(0); - setContentInsetEndWithActions(0); - setNavigationIcon(R.drawable.ic_arrow_back_black); - getNavigationIcon().setTint(Theme.getColor(R.attr.icon_tint_color, getContext())); - setNavigationContentDescription("返回"); + private void init() { } + + public void setTitle(String title, String subtitle) { + super.setTitle(title); + super.setSubtitle(subtitle); + } + + @Override + public void setTitle(int resId) { + super.setTitle(resId); + } + + private TextView mTitleView; + private TextView mSubTitleView; + + private void initTitleViewAndSubTitleView() { + int childCount = getChildCount(); + if (childCount > 0) { + for (int i = 0; i < childCount; i++) { + View view = getChildAt(i); + if (view instanceof TextView) { + if (mTitleView != null) { + mSubTitleView = (TextView) view; + break; + } + mTitleView = (TextView) view; + } + } + } + } + + /** + * 必须有主标题标题剧中才会生效 + * @param isCenter + */ + public void setTileCenter(boolean isCenter) { + if (isCenter) { + initTitleViewAndSubTitleView(); + if (mTitleView != null) { + mTitleView.setGravity(Gravity.CENTER); + Toolbar.LayoutParams layoutParams = (Toolbar.LayoutParams) mTitleView.getLayoutParams(); + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.CENTER; + mTitleView.setLayoutParams(layoutParams); + if (mSubTitleView != null) { + mSubTitleView.setGravity(Gravity.CENTER); + Toolbar.LayoutParams subTitleLayoutParams = (Toolbar.LayoutParams) mSubTitleView.getLayoutParams(); + subTitleLayoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + subTitleLayoutParams.gravity = Gravity.CENTER; + mSubTitleView.setLayoutParams(subTitleLayoutParams); + } + float marginStart = 0; + float marginEnd = 0; + if (getNavigationIcon() != null) { + marginEnd = ScaleUtils.dp(GENERATED_ITEM_MARGIN + GENERATED_ITEM_PADDING * 3); + } else if (getMenu().size() > 0) { + marginStart = ScaleUtils.dp(MIN_CELL_SIZE - GENERATED_ITEM_PADDING * 3); + } + setTitleMargin((int) marginStart, 0, (int) marginEnd, 0); + } + } + } + + private View mViewTitleView; + + public void setViewTileCenter(View viewTitleView) { + this.mViewTitleView = viewTitleView; + if (mViewTitleView != null) { + Toolbar.LayoutParams layoutParams = (Toolbar.LayoutParams) mViewTitleView.getLayoutParams(); + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + layoutParams.gravity = Gravity.CENTER; + float marginStart = 0; + float marginEnd = 0; + if (getNavigationIcon() != null) { + marginEnd = ScaleUtils.dp(GENERATED_ITEM_MARGIN + GENERATED_ITEM_PADDING * 3); + } else if (getMenu().size() > 0) { + marginStart = ScaleUtils.dp(MIN_CELL_SIZE - GENERATED_ITEM_PADDING * 3); + } + layoutParams.setMargins((int) marginStart, 0, (int) marginEnd, 0); + mViewTitleView.setLayoutParams(layoutParams); + } + } + + @Override + public void setElevation(float elevation) { + super.setElevation(elevation); + ViewGroup barParentViewGroup = (ViewGroup) this.getParent(); + if (barParentViewGroup != null) { + if (barParentViewGroup instanceof AppBarLayout) { + barParentViewGroup.setElevation(elevation); + } + } + } + + /** + * 设置默认返回按键, 并默认可用 + */ + public void displayHomeAsUpButton(AppCompatActivity activity) { + activity.setSupportActionBar(this); + if (activity.getSupportActionBar() != null) { + activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true); + activity.getSupportActionBar().setHomeButtonEnabled(true); + } + if (getNavigationIcon() != null) { + this.getNavigationIcon().setTint(Theme.getColor(R.attr.icon_tint_color, getContext())); + } + setNavigationOnClickListener(v -> activity.onBackPressed()); } @Override diff --git a/app/src/main/java/me/ghui/v2er/widget/SectionItemView.java b/app/src/main/java/me/ghui/v2er/widget/SectionItemView.java new file mode 100644 index 00000000..63f45525 --- /dev/null +++ b/app/src/main/java/me/ghui/v2er/widget/SectionItemView.java @@ -0,0 +1,168 @@ +package me.ghui.v2er.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; + +import me.ghui.v2er.R; +import me.ghui.v2er.util.ScaleUtils; +import me.ghui.v2er.util.Utils; + +public class SectionItemView extends RelativeLayout implements View.OnClickListener { + + private Drawable icon; + private String title; + private boolean showDivider; + private TextView sectionTitle; + private ImageView sectionIcon; + private DividerView sectionDivider; + + private OnSectionClickListener onSectionClickListener; + + public void setOnSectionClickListener(OnSectionClickListener onSectionClickListener) { + this.onSectionClickListener = onSectionClickListener; + } + + public interface OnSectionClickListener { + void onClick(View v); + } + +// public SectionItemView(@NonNull Context context) { +// super(context); +// initView(context, null); +// } + + public SectionItemView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(context, attrs); + } + +// public SectionItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { +// super(context, attrs, defStyleAttr); +// initView(context, attrs); +// } +// +// public SectionItemView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { +// super(context, attrs, defStyleAttr, defStyleRes); +// initView(context, attrs); +// } + + private void initAttrs(Context context, AttributeSet attrs) { + if (attrs != null) { + TypedArray styledAttrs = getContext().getTheme().obtainStyledAttributes(attrs, + R.styleable.SectionItemView, 0, 0); + icon = styledAttrs.getDrawable(R.styleable.SectionItemView_icon); + title = styledAttrs.getString(R.styleable.SectionItemView_title); + showDivider = styledAttrs.getBoolean(R.styleable.SectionItemView_show_divider, true); + styledAttrs.recycle(); + } + } + + private ViewGroup rootView; + private RelativeLayout sectionLayout; + + private void initView(Context context, AttributeSet attrs) { + initAttrs(context, attrs); + rootView = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.section_item_view_layout, this, true); + sectionLayout = rootView.findViewById(R.id.section_layout); + sectionTitle = rootView.findViewById(R.id.section_title); + sectionIcon = rootView.findViewById(R.id.section_icon); + sectionDivider = rootView.findViewById(R.id.section_divider); + sectionLayout.setOnClickListener(this); + if (icon != null) { + sectionIcon.setImageDrawable(icon); + } + if (!TextUtils.isEmpty(title)) { + sectionTitle.setText(title); + } + if (!showDivider) { + sectionDivider.setVisibility(View.INVISIBLE); + } + } + +// @Override +// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { +// super.onMeasure(widthMeasureSpec, heightMeasureSpec); +// int childCount = sectionLayout.getChildCount(); +// int desiredWidth = 0; +// int desiredHeight = 0; +// int childViewWidth = 0; +// int childViewHeight = 0; +// for (int i = 0; i < childCount; i++) { +// View childView = sectionLayout.getChildAt(i); +// Log.d(SectionItemView.this.getClass().getSimpleName(), "childView " + +// childView.getClass().getSimpleName()); +// if (childView instanceof ImageView) { +// childViewWidth = childView.getMeasuredWidth(); +// childViewHeight = childView.getMeasuredHeight(); +// if (childViewWidth > desiredWidth) { +// desiredWidth = childViewWidth; +// } +// if (childViewHeight > desiredHeight) { +// desiredHeight = childViewHeight; +// } +// } +// if (childView instanceof TextView) { +// childViewWidth = (int) (((TextView)childView).getTextSize() * ((TextView)childView).getText().length() +// + ((TextView)childView).getPaddingStart() +// + ((TextView)childView).getPaddingEnd()); +// childViewHeight = ((TextView)childView).getLineHeight() * ((TextView)childView) +// .getLineCount() + ((TextView)childView).getPaddingTop() +// + ((TextView)childView).getPaddingBottom(); +// if (childViewWidth > desiredWidth) { +// desiredWidth = childViewWidth; +// } +// if (childViewHeight > desiredHeight) { +// desiredHeight = childViewHeight; +// } +// } +// } +// int widthMode = MeasureSpec.getMode(widthMeasureSpec); +// int widthSize = MeasureSpec.getSize(widthMeasureSpec); +// int heightMode = MeasureSpec.getMode(heightMeasureSpec); +// int heightSize = MeasureSpec.getSize(heightMeasureSpec); +// +// int width; +// int height; +// +// if (widthMode == MeasureSpec.EXACTLY) { +// width = widthSize; +// } else if (widthMode == MeasureSpec.AT_MOST) { +// width = Math.min(desiredWidth, widthSize); +// } else { +// width = desiredWidth; +// } +// +// if (heightMode == MeasureSpec.EXACTLY) { +// height = heightSize; +// } else if (heightMode == MeasureSpec.AT_MOST) { +// height = Math.min(desiredHeight, heightSize); +//// height = heightSize; +// } else { +// height = desiredHeight; +// } +// setMeasuredDimension(width, height); +// } + + @Override + public void onClick(View v) { + if (onSectionClickListener != null) { + onSectionClickListener.onClick(this); + } + } + +} diff --git a/app/src/main/res/drawable-xxhdpi/ic_star_normal.png b/app/src/main/res/drawable-xxhdpi/ic_star_normal.png deleted file mode 100644 index 3a99755e..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_star_normal.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_star_selected.png b/app/src/main/res/drawable-xxhdpi/ic_star_selected.png deleted file mode 100644 index d2e62d28..00000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_star_selected.png and /dev/null differ diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml new file mode 100755 index 00000000..a9850bbe --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bookmark.xml b/app/src/main/res/drawable/ic_bookmark.xml new file mode 100644 index 00000000..6e302829 --- /dev/null +++ b/app/src/main/res/drawable/ic_bookmark.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_bookmarked.xml b/app/src/main/res/drawable/ic_bookmarked.xml new file mode 100644 index 00000000..20b742b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_bookmarked.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_favorites.xml b/app/src/main/res/drawable/ic_favorites.xml new file mode 100644 index 00000000..2ab4e6a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_favorites.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index af0694d4..75ab35dd 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -6,12 +6,6 @@ - + + diff --git a/app/src/main/res/drawable/ic_pencil.xml b/app/src/main/res/drawable/ic_pencil.xml new file mode 100644 index 00000000..5401933f --- /dev/null +++ b/app/src/main/res/drawable/ic_pencil.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_sets.xml b/app/src/main/res/drawable/ic_sets.xml new file mode 100644 index 00000000..9be725d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_sets.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_shortcuts_bookmark.xml b/app/src/main/res/drawable/ic_shortcuts_bookmark.xml new file mode 100644 index 00000000..4b4e2bb4 --- /dev/null +++ b/app/src/main/res/drawable/ic_shortcuts_bookmark.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_shortcuts_star.xml b/app/src/main/res/drawable/ic_shortcuts_star.xml deleted file mode 100644 index 0d67e67f..00000000 --- a/app/src/main/res/drawable/ic_shortcuts_star.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/main_bottom_navigation_selector.xml b/app/src/main/res/drawable/main_bottom_navigation_selector.xml new file mode 100644 index 00000000..f76a1247 --- /dev/null +++ b/app/src/main/res/drawable/main_bottom_navigation_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/act_main.xml b/app/src/main/res/layout/act_main.xml index ee1f137a..027531cf 100644 --- a/app/src/main/res/layout/act_main.xml +++ b/app/src/main/res/layout/act_main.xml @@ -1,61 +1,62 @@ - - + android:layout_height="?actionBarSize" + android:background="@color/white" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@+id/main_container"> + + + + - + - - - - - - - - - + + + + + android:layout_height="match_parent" /> + - - - - - - \ No newline at end of file + android:contentDescription="@string/acc_bottom_nav_menu" + app:layout_constraintTop_toBottomOf="@+id/main_container" + app:layout_constraintBottom_toBottomOf="parent" + app:labelVisibilityMode="labeled" + app:itemIconTint="@drawable/main_bottom_navigation_selector" + app:itemTextColor="@drawable/main_bottom_navigation_selector" + app:menu="@menu/bottom_menu_main" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/act_user_page.xml b/app/src/main/res/layout/act_user_page.xml index 33b6de8e..51c8a9d1 100644 --- a/app/src/main/res/layout/act_user_page.xml +++ b/app/src/main/res/layout/act_user_page.xml @@ -57,6 +57,7 @@ android:layout_width="wrap_content" android:gravity="center" android:paddingTop="6dp" + android:transitionName="@string/share_element_username" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@id/user_img" tools:text="ghui" /> diff --git a/app/src/main/res/layout/appbar_wrapper_toolbar.xml b/app/src/main/res/layout/appbar_wrapper_toolbar.xml index e49ad609..981e0886 100644 --- a/app/src/main/res/layout/appbar_wrapper_toolbar.xml +++ b/app/src/main/res/layout/appbar_wrapper_toolbar.xml @@ -1,7 +1,7 @@ diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 00000000..5543f7ad --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/mine_section_layout.xml b/app/src/main/res/layout/mine_section_layout.xml new file mode 100644 index 00000000..f996c959 --- /dev/null +++ b/app/src/main/res/layout/mine_section_layout.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/mine_user_info_simple_layout.xml b/app/src/main/res/layout/mine_user_info_simple_layout.xml new file mode 100644 index 00000000..1656cbfe --- /dev/null +++ b/app/src/main/res/layout/mine_user_info_simple_layout.xml @@ -0,0 +1,66 @@ + + + + + +