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();
}
}