package me.wcy.music.activity; import android.app.ProgressDialog; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.graphics.Color; import android.media.AudioManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StyleRes; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import me.wcy.music.R; import me.wcy.music.service.PlayService; import me.wcy.music.storage.preference.Preferences; import me.wcy.music.utils.PermissionReq; import me.wcy.music.utils.binding.ViewBinder; /** * 基类<br> * 如果继承本类,需要在 layout 中添加 {@link Toolbar} ,并将 AppTheme 继承 Theme.AppCompat.NoActionBar 。 * Created by wcy on 2015/11/26. */ public abstract class BaseActivity extends AppCompatActivity { protected Handler handler; protected PlayService playService; private ServiceConnection serviceConnection; private ProgressDialog progressDialog; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { if (Preferences.isNightMode()) { setTheme(getDarkTheme()); } super.onCreate(savedInstanceState); setSystemBarTransparent(); setVolumeControlStream(AudioManager.STREAM_MUSIC); handler = new Handler(Looper.getMainLooper()); bindService(); } @StyleRes protected int getDarkTheme() { return R.style.AppThemeDark; } @Override public void setContentView(int layoutResID) { super.setContentView(layoutResID); initView(); } @Override public void setContentView(View view) { super.setContentView(view); initView(); } @Override public void setContentView(View view, ViewGroup.LayoutParams params) { super.setContentView(view, params); initView(); } private void initView() { ViewBinder.bind(this); Toolbar mToolbar = findViewById(R.id.toolbar); if (mToolbar == null) { throw new IllegalStateException("Layout is required to include a Toolbar with id 'toolbar'"); } setSupportActionBar(mToolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); } } private void bindService() { Intent intent = new Intent(); intent.setClass(this, PlayService.class); serviceConnection = new PlayServiceConnection(); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } private class PlayServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { playService = ((PlayService.PlayBinder) service).getService(); onServiceBound(); } @Override public void onServiceDisconnected(ComponentName name) { Log.e(getClass().getSimpleName(), "service disconnected"); } } protected void onServiceBound() { } private void setSystemBarTransparent() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // LOLLIPOP解决方案 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); getWindow().setStatusBarColor(Color.TRANSPARENT); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { // KITKAT解决方案 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { finish(); return true; } return super.onOptionsItemSelected(item); } public void showProgress() { showProgress(getString(R.string.loading)); } public void showProgress(String message) { if (progressDialog == null) { progressDialog = new ProgressDialog(this); progressDialog.setCancelable(false); } progressDialog.setMessage(message); if (!progressDialog.isShowing()) { progressDialog.show(); } } public void cancelProgress() { if (progressDialog != null && progressDialog.isShowing()) { progressDialog.cancel(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); PermissionReq.onRequestPermissionsResult(requestCode, permissions, grantResults); } @Override protected void onDestroy() { if (serviceConnection != null) { unbindService(serviceConnection); } super.onDestroy(); } }
package me.wcy.music.activity; import android.Manifest; import android.annotation.SuppressLint; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.design.widget.NavigationView; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import me.wcy.music.R; import me.wcy.music.adapter.FragmentAdapter; import me.wcy.music.constants.Extras; import me.wcy.music.constants.Keys; import me.wcy.music.executor.ControlPanel; import me.wcy.music.executor.NaviMenuExecutor; import me.wcy.music.executor.WeatherExecutor; import me.wcy.music.fragment.LocalMusicFragment; import me.wcy.music.fragment.PlayFragment; import me.wcy.music.fragment.SheetListFragment; import me.wcy.music.service.AudioPlayer; import me.wcy.music.service.QuitTimer; import me.wcy.music.utils.PermissionReq; import me.wcy.music.utils.SystemUtils; import me.wcy.music.utils.ToastUtils; import me.wcy.music.utils.binding.Bind; public class MusicActivity extends BaseActivity implements View.OnClickListener, QuitTimer.OnTimerListener, NavigationView.OnNavigationItemSelectedListener, ViewPager.OnPageChangeListener { @Bind(R.id.drawer_layout) private DrawerLayout drawerLayout; @Bind(R.id.navigation_view) private NavigationView navigationView; @Bind(R.id.iv_menu) private ImageView ivMenu; @Bind(R.id.iv_search) private ImageView ivSearch; @Bind(R.id.tv_local_music) private TextView tvLocalMusic; @Bind(R.id.tv_online_music) private TextView tvOnlineMusic; @Bind(R.id.tv_random_music) private TextView tvRandomMusic;//随机 @Bind(R.id.viewpager) private ViewPager mViewPager; @Bind(R.id.fl_play_bar) private FrameLayout flPlayBar; private View vNavigationHeader; private LocalMusicFragment mLocalMusicFragment; private SheetListFragment mSheetListFragment; private PlayFragment mPlayFragment; private ControlPanel controlPanel; private NaviMenuExecutor naviMenuExecutor; private MenuItem timerItem; private boolean isPlayFragmentShow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_music); } @Override protected void onServiceBound() { setupView(); updateWeather(); controlPanel = new ControlPanel(flPlayBar); naviMenuExecutor = new NaviMenuExecutor(this); AudioPlayer.get().addOnPlayEventListener(controlPanel); QuitTimer.get().setOnTimerListener(this); parseIntent(); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); parseIntent(); } private void setupView() { // add navigation header vNavigationHeader = LayoutInflater.from(this).inflate(R.layout.navigation_header, navigationView, false); navigationView.addHeaderView(vNavigationHeader); // setup view pager mLocalMusicFragment = new LocalMusicFragment(); mSheetListFragment = new SheetListFragment(); FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); adapter.addFragment(mLocalMusicFragment); adapter.addFragment(mSheetListFragment); mViewPager.setAdapter(adapter); tvLocalMusic.setSelected(true); ivMenu.setOnClickListener(this); ivSearch.setOnClickListener(this); tvLocalMusic.setOnClickListener(this); tvOnlineMusic.setOnClickListener(this); flPlayBar.setOnClickListener(this); mViewPager.addOnPageChangeListener(this); navigationView.setNavigationItemSelectedListener(this); } private void updateWeather() { PermissionReq.with(this) .permissions(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION) .result(new PermissionReq.Result() { @Override public void onGranted() { new WeatherExecutor(MusicActivity.this, vNavigationHeader).execute(); } @Override public void onDenied() { ToastUtils.show(R.string.no_permission_location); } }) .request(); } private void parseIntent() { Intent intent = getIntent(); if (intent.hasExtra(Extras.EXTRA_NOTIFICATION)) { showPlayingFragment(); setIntent(new Intent()); } } @Override public void onTimer(long remain) { if (timerItem == null) { timerItem = navigationView.getMenu().findItem(R.id.action_timer); } String title = getString(R.string.menu_timer); timerItem.setTitle(remain == 0 ? title : SystemUtils.formatTime(title + "(mm:ss)", remain)); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.iv_menu: drawerLayout.openDrawer(GravityCompat.START); break; case R.id.iv_search: startActivity(new Intent(this, SearchMusicActivity.class)); break; case R.id.tv_local_music: mViewPager.setCurrentItem(0); break; case R.id.tv_online_music: startActivity(new Intent(this, online.class)); break; case R.id.tv_random_music: mViewPager.setCurrentItem(1); break; case R.id.fl_play_bar: showPlayingFragment(); break; } } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { drawerLayout.closeDrawers(); handler.postDelayed(() -> item.setChecked(false), 500); return naviMenuExecutor.onNavigationItemSelected(item); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position == 0) { tvLocalMusic.setSelected(true); tvOnlineMusic.setSelected(false); } else { tvLocalMusic.setSelected(false); tvOnlineMusic.setSelected(true); } } @Override public void onPageScrollStateChanged(int state) { } private void showPlayingFragment() { if (isPlayFragmentShow) { return; } FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(R.anim.fragment_slide_up, 0); if (mPlayFragment == null) { mPlayFragment = new PlayFragment(); ft.replace(android.R.id.content, mPlayFragment); } else { ft.show(mPlayFragment); } ft.commitAllowingStateLoss(); isPlayFragmentShow = true; } private void hidePlayingFragment() { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(0, R.anim.fragment_slide_down); ft.hide(mPlayFragment); ft.commitAllowingStateLoss(); isPlayFragmentShow = false; } @Override public void onBackPressed() { if (mPlayFragment != null && isPlayFragmentShow) { hidePlayingFragment(); return; } if (drawerLayout.isDrawerOpen(GravityCompat.START)) { drawerLayout.closeDrawers(); return; } super.onBackPressed(); } @SuppressLint("MissingSuperCall") @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(Keys.VIEW_PAGER_INDEX, mViewPager.getCurrentItem()); mLocalMusicFragment.onSaveInstanceState(outState); mSheetListFragment.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(final Bundle savedInstanceState) { mViewPager.post(() -> { mViewPager.setCurrentItem(savedInstanceState.getInt(Keys.VIEW_PAGER_INDEX), false); mLocalMusicFragment.onRestoreInstanceState(savedInstanceState); mSheetListFragment.onRestoreInstanceState(savedInstanceState); }); } @Override protected void onDestroy() { AudioPlayer.get().removeOnPlayEventListener(controlPanel); QuitTimer.get().setOnTimerListener(null); super.onDestroy(); } }