/* * Copyright (c) 2020 WildFireChat. All rights reserved. */ package cn.wildfire.chat.kit; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.LayoutRes; import androidx.annotation.MenuRes; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnItemSelected; import cn.wildfire.chat.kit.widget.SearchView; import java.util.ArrayList; public abstract class WfcBaseActivity extends AppCompatActivity { private static final String TAG = "WfcBaseActivity"; @BindView(R2.id.toolbar) protected Toolbar toolbar; @BindView(R2.id.chat_layout) LinearLayout chatNickNamesLayout; @BindView(R2.id.tb_search_view) protected SearchView searchView; @BindView(R2.id.user_lineStatus_toolbar) Spinner spinner; @BindView(R2.id.top_title_toolbar) TextView nickNameTextView; final String[] lineStatusItems = {"空闲", "忙碌"}; final int[] lineStatusIconItems = {R.drawable.av_camera, R.drawable.av_mute}; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); beforeViews(); setContentView(contentLayout()); ButterKnife.bind(this); setSupportActionBar(toolbar); SharedPreferences sp = getSharedPreferences("config", Context.MODE_PRIVATE); if (sp.getBoolean("darkTheme", false)) { // dark toolbar.getContext().setTheme(R.style.AppTheme_DarkAppbar); customToolbarAndStatusBarBackgroundColor(true); } else { // light toolbar.getContext().setTheme(R.style.AppTheme_LightAppbar); customToolbarAndStatusBarBackgroundColor(false); } initLineStatus(); afterViews(); } private void initLineStatus() { ArrayList lineStatusModels = new ArrayList<>(); for (int i = 0; i < lineStatusIconItems.length; i++) { int lineStatusIconItem = lineStatusIconItems[i]; String lineStatusItem = lineStatusItems[i]; lineStatusModels.add(new LineStatusModel(lineStatusIconItem, lineStatusItem)); } LineStatusAdapter lineStatusAdapter = new LineStatusAdapter(this, lineStatusModels); spinner.setAdapter(lineStatusAdapter); } public void showUserStatus() { spinner.setVisibility(View.VISIBLE); chatNickNamesLayout.setVisibility(View.GONE); } public void setNickName() { spinner.setVisibility(View.GONE); CharSequence title = getTitle(); Log.i(TAG, "showNickName: title:" + title); chatNickNamesLayout.setVisibility(View.VISIBLE); nickNameTextView.setText(title); setTitle(getString(R.string.Empty)); } public void showSearchView() { searchView.setVisibility(View.VISIBLE); } /** * @param darkTheme 和toolbar.xml里面的 app:theme="@style/AppTheme.DarkAppbar" 相关 */ private void customToolbarAndStatusBarBackgroundColor(boolean darkTheme) { int toolbarBackgroundColorResId = darkTheme ? R.color.colorPrimary : R.color.white; Drawable drawable = getResources().getDrawable(R.mipmap.ic_back); if (darkTheme) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { drawable.setTint(Color.WHITE); } toolbar.setTitleTextColor(Color.WHITE); } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { drawable.setTintList(null); } } getSupportActionBar().setHomeAsUpIndicator(drawable); if (showHomeMenuItem()) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } setTitleBackgroundResource(toolbarBackgroundColorResId, darkTheme); } /** * 设置状态栏和标题栏的颜色 * * @param resId 颜色资源id */ protected void setTitleBackgroundResource(int resId, boolean dark) { toolbar.setBackgroundResource(resId); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarColor(ContextCompat.getColor(this, resId)); } setStatusBarTheme(this, dark); } protected boolean isDarkTheme() { SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); return sp.getBoolean("darkTheme", true); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (menu() != 0) { getMenuInflater().inflate(menu(), menu); } afterMenus(menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { hideInputMethod(); onBackPressed(); return true; } return super.onOptionsItemSelected(item); } protected void hideInputMethod() { InputMethodManager imm = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE); View view = getCurrentFocus(); if (view != null) { imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } /** * @return 布局文件 */ protected abstract @LayoutRes int contentLayout(); /** * @return menu */ protected @MenuRes int menu() { return 0; } /** * {@link AppCompatActivity#setContentView(int)}之前调用 */ protected void beforeViews() { } /** * {@link AppCompatActivity#setContentView(int)}之后调用 *

* 此时已经调用了{@link ButterKnife#bind(Activity)}, 子类里面不需要再次调用 */ protected void afterViews() { } /** * {@code getMenuInflater().inflate(menu(), menu);}之后调用 * * @param menu */ protected void afterMenus(Menu menu) { } @Override protected void onPause() { super.onPause(); hideInputMethod(); } protected boolean showHomeMenuItem() { return true; } public boolean checkPermission(String permission) { return checkPermission(new String[]{permission}); } public boolean checkPermission(String[] permissions) { boolean granted = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { for (String permission : permissions) { granted = checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED; if (!granted) { break; } } } return granted; } /** * Changes the System Bar Theme. */ public static void setStatusBarTheme(final Activity pActivity, final boolean pIsDark) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Fetch the current flags. final int lFlags = pActivity.getWindow().getDecorView().getSystemUiVisibility(); // Update the SystemUiVisibility dependening on whether we want a Light or Dark theme. pActivity.getWindow().getDecorView().setSystemUiVisibility(pIsDark ? (lFlags & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) : (lFlags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR)); } } @OnItemSelected(R2.id.user_lineStatus_toolbar) public void spinnerClick(AdapterView parent, View view, int pos, long id) { Log.i(TAG, "spinnerClick: " + pos); } }