package org.briarproject.android; import android.os.Bundle; import android.os.IBinder; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.inputmethod.InputMethodManager; import org.briarproject.android.controller.ActivityLifecycleController; import java.util.ArrayList; import java.util.List; import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; import static org.briarproject.android.TestingConstants.PREVENT_SCREENSHOTS; public abstract class BaseActivity extends AppCompatActivity implements DestroyableContext { protected ActivityComponent activityComponent; private final List<ActivityLifecycleController> lifecycleControllers = new ArrayList<>(); private boolean destroyed = false; public abstract void injectActivity(ActivityComponent component); public void addLifecycleController(ActivityLifecycleController alc) { lifecycleControllers.add(alc); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (PREVENT_SCREENSHOTS) getWindow().addFlags(FLAG_SECURE); AndroidComponent applicationComponent = ((BriarApplication) getApplication()).getApplicationComponent(); activityComponent = DaggerActivityComponent.builder() .androidComponent(applicationComponent) .activityModule(getActivityModule()) .build(); injectActivity(activityComponent); for (ActivityLifecycleController alc : lifecycleControllers) { alc.onActivityCreate(this); } } public ActivityComponent getActivityComponent() { return activityComponent; } // This exists to make test overrides easier protected ActivityModule getActivityModule() { return new ActivityModule(this); } @Override protected void onStart() { super.onStart(); for (ActivityLifecycleController alc : lifecycleControllers) { alc.onActivityStart(); } } @Override protected void onStop() { super.onStop(); for (ActivityLifecycleController alc : lifecycleControllers) { alc.onActivityStop(); } } @Override protected void onDestroy() { super.onDestroy(); destroyed = true; for (ActivityLifecycleController alc : lifecycleControllers) { alc.onActivityDestroy(); } } @Override public void runOnUiThreadUnlessDestroyed(final Runnable r) { runOnUiThread(new Runnable() { @Override public void run() { if (!destroyed && !isFinishing()) r.run(); } }); } public void showSoftKeyboard(View view) { Object o = getSystemService(INPUT_METHOD_SERVICE); ((InputMethodManager) o).showSoftInput(view, SHOW_IMPLICIT); } public void hideSoftKeyboard(View view) { IBinder token = view.getWindowToken(); Object o = getSystemService(INPUT_METHOD_SERVICE); ((InputMethodManager) o).hideSoftInputFromWindow(token, 0); } }