package com.gh.base; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; import com.gh.common.util.DisplayUtils; import com.gh.download.DownloadManager; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.GameUpdateEntity; import com.gh.gamecenter.eventbus.EBDownloadStatus; import com.gh.gamecenter.normal.ToolbarController; import com.gh.gamecenter.packagehelper.PackageViewModel; import com.lightgame.OnTitleClickListener; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; /** * 需要用到工具栏的页面使用 *

* 特殊页面请参考{@link BaseActivity} */ public abstract class ToolBarActivity extends BaseActivity implements ToolbarController, Toolbar.OnMenuItemClickListener { @Nullable private PackageViewModel mPackageViewModel; protected View mToolbarContainer; protected Toolbar mToolbar; protected TextView mTitleTv; @Nullable private TextView mDownloadCountHint; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStatusBarDarkMode(true, this); initToolbar(); if (showDownloadMenu()) { mPackageViewModel = ViewModelProviders.of(this, new PackageViewModel.Factory()).get(PackageViewModel.class); mPackageViewModel.getFilterSameUpdateLiveData().observe(this, this::updateDownloadCountHint); } } // 小米沉浸式黑色字体 @SuppressLint("PrivateApi") public void setStatusBarDarkMode(boolean darkmode, Activity activity) { Class clazz = activity.getWindow().getClass(); try { Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); int darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag); } catch (Exception ignore) { } } private void initToolbar() { mToolbarContainer = findViewById(R.id.normal_toolbar_container); mToolbar = findViewById(R.id.normal_toolbar); mTitleTv = findViewById(R.id.normal_title); if (mToolbar != null) { // setSupportActionBar(mToolbar); // 替换actionBar后 toolBar无法控制 mToolbar.setNavigationIcon(provideNavigationIcon()); mToolbar.setNavigationOnClickListener(provideNavigationItemClickListener()); if (mTitleTv != null) { mTitleTv.setOnClickListener(view -> { final List fragmentList = getSupportFragmentManager().getFragments(); for (Fragment fragment : fragmentList) { if (fragment instanceof OnTitleClickListener) { ((OnTitleClickListener) fragment).onTitleClick(); } } }); } } } @DrawableRes public int provideNavigationIcon() { return R.drawable.ic_bar_back; // default navigation icon } @Override public void setNavigationTitle(String title) { if (mTitleTv != null) mTitleTv.setText(title); } @Override public void setNavigationTitle(@StringRes int res) { setNavigationTitle(getString(res)); } /** * 重写此方法以将标题靠左显示 */ public boolean showToolbarAtLeft() { return false; } @Override public void setToolbarMenu(int res) { if (mToolbar == null) return; mToolbar.inflateMenu(res); mToolbar.setOnMenuItemClickListener(this); if (showDownloadMenu()) { createDownloadMenu(res); } Menu menu = mToolbar.getMenu(); for (int i = 0; i < menu.size(); i++) { MenuItem menuItem = menu.getItem(i); // menu设置actionLayout后,无法捕捉点击事件,以icon为tag,如果icon is null 手动设置menuItem点击事件 if (menuItem != null && menuItem.getIcon() == null) { if (menuItem.getActionView() != null) { menuItem.getActionView().setOnClickListener((v) -> this.onMenuItemClick(menuItem)); } } } // 限制标题实际宽度 防止标题挡住toolbar menu按钮 if (menu.size() > 2 && mTitleTv != null) { ViewGroup.LayoutParams layoutParams = mTitleTv.getLayoutParams(); if (layoutParams instanceof RelativeLayout.LayoutParams) { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layoutParams; if (showToolbarAtLeft()) { params.addRule(RelativeLayout.ALIGN_PARENT_LEFT); params.addRule(RelativeLayout.CENTER_VERTICAL); params.setMargins(DisplayUtils.dip2px(55), 0, DisplayUtils.dip2px(48 * menu.size()), 0); } else { params.setMargins(DisplayUtils.dip2px(90), 0, DisplayUtils.dip2px(90), 0); } mTitleTv.setLayoutParams(params); } } else { if (showToolbarAtLeft()) { ViewGroup.LayoutParams layoutParams = mTitleTv.getLayoutParams(); if (layoutParams instanceof RelativeLayout.LayoutParams) { RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layoutParams; params.addRule(RelativeLayout.CENTER_VERTICAL); params.setMargins(DisplayUtils.dip2px(55), 0, DisplayUtils.dip2px(48 * menu.size()), 0); mTitleTv.setLayoutParams(params); } } } } private void createDownloadMenu(int res) { if (res != R.menu.menu_download) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_download, mToolbar.getMenu()); } if (mPackageViewModel != null) { updateDownloadCountHint(mPackageViewModel.getFilterSameUpdateLiveData().getValue()); } View downloadMenuView = mToolbar.getMenu().findItem(R.id.menu_download).getActionView(); mDownloadCountHint = downloadMenuView.findViewById(R.id.menu_download_count_hint); } private void updateDownloadCountHint(List updateList) { if (mDownloadCountHint == null) return; String count = DownloadManager.getInstance(getApplicationContext()).getDownloadOrUpdateCount(updateList); if (count != null) { mDownloadCountHint.setVisibility(View.VISIBLE); mDownloadCountHint.setText(count); ViewGroup.LayoutParams params = mDownloadCountHint.getLayoutParams(); if (TextUtils.isEmpty(count)) { params.width = DisplayUtils.dip2px(6); params.height = DisplayUtils.dip2px(6); } else { params.width = DisplayUtils.dip2px(12); params.height = DisplayUtils.dip2px(12); } mDownloadCountHint.setLayoutParams(params); } else { mDownloadCountHint.setVisibility(View.GONE); } } @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBDownloadStatus status) { if (showDownloadMenu() && mPackageViewModel != null) { updateDownloadCountHint(mPackageViewModel.getFilterSameUpdateLiveData().getValue()); } } @Override public MenuItem getMenuItem(int res) { if (mToolbar == null) return null; //后续页面做好判断 return mToolbar.getMenu().findItem(res); } public void clearMenu() { if (mToolbar != null) { mToolbar.getMenu().clear(); } } public Menu getMenu() { return mToolbar.getMenu(); } @Override public boolean onMenuItemClick(MenuItem item) { if (item.getItemId() == R.id.menu_download) { // MtaHelper.onEvent("下载管理", "下载管理入口", getActivityNameInChinese()); Intent intent = DownloadManagerActivity.getDownloadMangerIntent(this, mEntrance); startActivity(intent); } return false; } protected View.OnClickListener provideNavigationItemClickListener() { return view -> onBackPressed(); } protected boolean showDownloadMenu() { return false; } @Override public void hideToolbar(boolean isHide) { if (mToolbarContainer != null) { mToolbarContainer.setVisibility(isHide ? View.GONE : View.VISIBLE); } } }