package eu.se_bastiaan.popcorntimeremote.activities; import android.annotation.TargetApi; import android.content.Intent; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; import android.view.Window; import android.widget.ProgressBar; import android.widget.RelativeLayout; import com.google.gson.internal.LinkedTreeMap; import com.squareup.okhttp.Call; import java.util.ArrayList; import butterknife.ButterKnife; import butterknife.Bind; import eu.se_bastiaan.popcorntimeremote.R; import eu.se_bastiaan.popcorntimeremote.fragments.ConnectionLostFragment; import eu.se_bastiaan.popcorntimeremote.fragments.LoadingControllerFragment; import eu.se_bastiaan.popcorntimeremote.fragments.MainControllerFragment; import eu.se_bastiaan.popcorntimeremote.fragments.MovieControllerFragment; import eu.se_bastiaan.popcorntimeremote.fragments.PlayerControllerFragment; import eu.se_bastiaan.popcorntimeremote.fragments.SeriesControllerFragment; import eu.se_bastiaan.popcorntimeremote.rpc.PopcornTimeRpcClient; import eu.se_bastiaan.popcorntimeremote.utils.ActionBarBackground; import eu.se_bastiaan.popcorntimeremote.utils.PixelUtils; public class ControllerActivity extends AppCompatActivity { public static final String KEY_IP = "ipAddress", KEY_PORT = "port", KEY_USERNAME = "username", KEY_PASSWORD = "password", KEY_NAME = "name", KEY_VERSION = "version"; private static final String PLAYER = "player"; private static final String SHOWS_CONTAINER_CONTAIN = "shows-container-contain"; private static final String MOVIE_DETAIL = "movie-detail"; private static final String APP_OVERLAY = "app-overlay"; private Bundle mExtras; private PopcornTimeRpcClient mRpc; private Handler mHandler; private String mCurrentFragment, mTopView; private Call mViewstackFuture; @Bind(R.id.progressBar) ProgressBar progressBar; @Bind(R.id.toolbar) Toolbar toolbar; private final Runnable mGetViewstackRunnable = new Runnable() { @Override @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void run() { mViewstackFuture = mRpc.getViewstack(new PopcornTimeRpcClient.Callback() { @Override public void onCompleted(Exception e, PopcornTimeRpcClient.RpcResponse result) { try { if (e == null && result != null && result.result != null) { LinkedTreeMap<String, Object> map = result.getMapResult(); if (map.containsKey("viewstack")) { ArrayList<String> resultList = (ArrayList<String>) map.get("viewstack"); mTopView = resultList.get(resultList.size() - 1); Boolean translucentActionBar = false; String shownFragment = mCurrentFragment = mCurrentFragment != null ? mCurrentFragment : ""; if (mTopView.equals(PLAYER) && !mCurrentFragment.equals(PLAYER)) { setFragment(new PlayerControllerFragment()); mCurrentFragment = mTopView; translucentActionBar = true; } else if (mTopView.equals(SHOWS_CONTAINER_CONTAIN) && !mCurrentFragment.equals(SHOWS_CONTAINER_CONTAIN)) { setFragment(new SeriesControllerFragment()); mCurrentFragment = mTopView; } else if (mTopView.equals(MOVIE_DETAIL) && !mCurrentFragment.equals(MOVIE_DETAIL)) { setFragment(new MovieControllerFragment()); mCurrentFragment = mTopView; translucentActionBar = true; } else if (mTopView.equals(APP_OVERLAY) && !mCurrentFragment.equals(APP_OVERLAY)) { setFragment(new LoadingControllerFragment()); mCurrentFragment = mTopView; } else if (!(mTopView.equals(PLAYER) || mTopView.equals(SHOWS_CONTAINER_CONTAIN) || mTopView.equals(MOVIE_DETAIL) || mTopView.equals(APP_OVERLAY)) && !mCurrentFragment.equals("main")) { setFragment(new MainControllerFragment()); mCurrentFragment = "main"; } Window window = getWindow(); if(translucentActionBar && !shownFragment.equals(mCurrentFragment)) { if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { window.setStatusBarColor(getResources().getColor(android.R.color.transparent)); } mHandler.post(new Runnable() { @Override public void run() { getSupportActionBar().setTitle(""); ActionBarBackground.fadeOut(ControllerActivity.this); } }); } else if(!translucentActionBar && !shownFragment.equals(mCurrentFragment)) { if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { window.setStatusBarColor(getResources().getColor(R.color.primary_dark)); } mHandler.post(new Runnable() { @Override public void run() { getSupportActionBar().setTitle(getString(R.string.app_name)); ActionBarBackground.changeColor(ControllerActivity.this, getResources().getColor(R.color.primary)); } }); } if(mTopView.equals(PLAYER)) { mHandler.post(new Runnable() { @Override public void run() { getSupportActionBar().setTitle(R.string.now_playing); } }); } } mHandler.postDelayed(mGetViewstackRunnable, 500); } else if (e != null) { e.printStackTrace(); showNoConnection(); } } catch (Exception exception) { exception.printStackTrace(); } } }); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_framelayout); ButterKnife.bind(this); setSupportActionBar(toolbar); if(Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) { toolbar.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material) + PixelUtils.getStatusBarHeight(this))); } else { toolbar.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, getResources().getDimensionPixelSize(R.dimen.abc_action_bar_default_height_material))); } Intent intent = getIntent(); mExtras = intent.getExtras(); if(mExtras != null && mExtras.containsKey(KEY_IP) && mExtras.containsKey(KEY_PORT) && mExtras.containsKey(KEY_USERNAME) && mExtras.containsKey(KEY_PASSWORD) && mExtras.containsKey(KEY_NAME)) { mRpc = new PopcornTimeRpcClient(mExtras.getString(KEY_IP), mExtras.getString(KEY_PORT), mExtras.getString(KEY_USERNAME), mExtras.getString(KEY_PASSWORD)); //getSupportActionBar().setTitle(getString(R.string.connected_to) + ": " + mExtras.getString(KEY_NAME)); getSupportActionBar().setTitle(getString(R.string.app_name)); } else { finish(); } mHandler = new Handler(getMainLooper()); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } @Override protected void onResume() { super.onResume(); if(mViewstackFuture == null) { runViewstackRunnable(); } else { mGetViewstackRunnable.run(); } } @Override protected void onPause() { super.onPause(); getSupportFragmentManager().popBackStack(); if(mViewstackFuture != null) mViewstackFuture.cancel(); mHandler.removeCallbacksAndMessages(null); } public void setFragment(Fragment fragment) { try { mHandler.post(new Runnable() { @Override public void run() { progressBar.setVisibility(View.GONE); } }); DialogFragment dialogFragment = (DialogFragment) getSupportFragmentManager().findFragmentByTag("overlay_fragment"); if (dialogFragment != null) dialogFragment.dismiss(); fragment.setArguments(mExtras); FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); if (mCurrentFragment.equals(PLAYER)) { mHandler.post(new Runnable() { @Override public void run() { toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); } }); fragmentTransaction.setCustomAnimations(R.anim.still, R.anim.slide_down); } else if(mTopView.equals(PLAYER)) { mHandler.post(new Runnable() { @Override public void run() { toolbar.setNavigationIcon(R.drawable.abc_ic_clear_mtrl_alpha); } }); fragmentTransaction.setCustomAnimations(R.anim.slide_up, R.anim.still); } else { fragmentTransaction.setCustomAnimations(R.anim.fade_open, R.anim.fade_close); } fragmentTransaction.replace(R.id.frameLayout, fragment); fragmentTransaction.commit(); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == android.R.id.home) { onBackPressed(); } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if(mTopView == null || mTopView.equals("main-browser") || mTopView.equals("no-connection")) { super.onBackPressed(); } else { mRpc.back(new PopcornTimeRpcClient.Callback() { @Override public void onCompleted(Exception e, PopcornTimeRpcClient.RpcResponse result) { } }); } } private void showNoConnection() { mCurrentFragment = mTopView = "no-connection"; setFragment(new ConnectionLostFragment()); mHandler.post(new Runnable() { @Override public void run() { ActionBarBackground.fadeDrawable(ControllerActivity.this, new ColorDrawable(getResources().getColor(R.color.primary))); } }); } public void runViewstackRunnable() { try { getSupportFragmentManager().popBackStack(); mRpc.ping(new PopcornTimeRpcClient.Callback() { @Override public void onCompleted(Exception e, PopcornTimeRpcClient.RpcResponse result) { if (e == null) { mExtras.putString(KEY_VERSION, mRpc.getVersion()); mGetViewstackRunnable.run(); } else { e.printStackTrace(); showNoConnection(); } } }); } catch (Exception e) { } } }