/* * Protocoder * A prototyping platform for Android devices * * Victor Diaz Barrales victormdb@gmail.com * * Copyright (C) 2014 Victor Diaz * Copyright (C) 2013 Motorola Mobility LLC * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software * is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * */ package org.protocoderrunner.base; import android.annotation.SuppressLint; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Point; import android.media.AudioManager; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.provider.Settings; import android.speech.RecognizerIntent; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBarActivity; import android.view.Display; import android.view.KeyEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; import org.protocoderrunner.AppSettings; import org.protocoderrunner.R; import org.protocoderrunner.media.Audio; import org.protocoderrunner.utils.MLog; import java.util.ArrayList; @SuppressLint("NewApi") public class BaseActivity extends ActionBarActivity { private static final String TAG = "BaseActivity"; public boolean actionBarAllowed = true; private boolean lightsOutMode; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // if (AppSettings.FULLSCREEN) { // setFullScreen(); // } // // if (AppSettings.HIDE_HOME_BAR) { // setHideHomeBar(); // } // // if (AppSettings.SCREEN_ALWAYS_ON) { // setScreenAlwaysOn(); // } // // setVolume(100); // setBrightness(1f); } public Point getScrenSize() { Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); return size; } public int getNavigationBarHeight() { Resources resources = getResources(); int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { return resources.getDimensionPixelSize(resourceId); } return 0; } public void setFullScreen() { actionBarAllowed = true; // activity in full screen //supportRequestWindowFeature(Window.FEATURE_NO_TITLE); // requestWindowFeature(Window.FEATURE_ACTION_BAR); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } public void setImmersive() { actionBarAllowed = false; getSupportActionBar().hide(); // activity in full screen //supportRequestWindowFeature(Window.FEATURE_NO_TITLE); // requestWindowFeature(Window.FEATURE_ACTION_BAR); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); } public void showHomeBar(boolean b) { if (Build.VERSION.SDK_INT > AppSettings.MIN_SUPPORTED_VERSION) { if (b == true) { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } else { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } } } public void lightsOutMode() { lightsOutMode = true; final View rootView = getWindow().getDecorView(); rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); rootView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { MLog.d(TAG, "" + visibility); rootView.setSystemUiVisibility(View.STATUS_BAR_VISIBLE); rootView.setSystemUiVisibility(View.STATUS_BAR_HIDDEN); } }); } public void setScreenAlwaysOn(boolean b) { if (b) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } public boolean isScreenOn() { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } public void goToSleep() { //PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); //pm.goToSleep(100); } public boolean isAirplaneMode() { return Settings.System.getInt(getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0) != 0; } public boolean isUSBMassStorageEnabled() { return Settings.System.getInt(getContentResolver(), Settings.Global.USB_MASS_STORAGE_ENABLED, 0) != 0; } public boolean isADBEnabled() { return Settings.System.getInt(getContentResolver(), Settings.Global.ADB_ENABLED, 0) != 0; } public void setEnableSoundEffects(boolean b) { if (b) { Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 1); } else { Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED, 0); } } public void changeFragment(int id, Fragment fragment) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(id, fragment); fragmentTransaction.commit(); } public void addFragment(Fragment fragment, int fragmentPosition, String tag, boolean addToBackStack) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); ft.add(fragmentPosition, fragment, tag); // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); if (addToBackStack) { ft.addToBackStack(null); } ft.commit(); } public void addFragment(Fragment fragment, int fragmentPosition, boolean addToBackStack) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); // FIXME: Because we have no tagging system we need to use the int as a // tag, which may cause collisions ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); ft.add(fragmentPosition, fragment, String.valueOf(fragmentPosition)); // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); if (addToBackStack) { ft.addToBackStack(null); } ft.commit(); } public void removeFragment(Fragment fragment) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); ft.remove(fragment); ft.commit(); } public boolean isTablet() { boolean xlarge = ((this.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4); boolean large = ((this.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE); return (xlarge || large); } public boolean isWear() { boolean b = false; //b = getResources().getBoolean(R.bool.isWatch); return b; } public void setBrightness(float f) { WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); layoutParams.screenBrightness = f; getWindow().setAttributes(layoutParams); } public float getCurrentBrightness() { WindowManager.LayoutParams layoutParams = getWindow().getAttributes(); return layoutParams.screenBrightness; } public void setVolume(int value) { AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int maxValue = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); float val = (float) (value / 100.0 * maxValue); audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, Math.round(val), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); } PowerManager.WakeLock wl; public void setWakeLock(boolean b) { PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); if (wl == null) { wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); if (b) { wl.acquire(); } } else { if (!b) { wl.release(); } } } public void setGlobalBrightness(int brightness) { // constrain the value of brightness if (brightness < 0) { brightness = 0; } else if (brightness > 255) { brightness = 255; } ContentResolver cResolver = this.getApplicationContext().getContentResolver(); Settings.System.putInt(cResolver, Settings.System.SCREEN_BRIGHTNESS, brightness); } public void setScreenTimeout(int time) { Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_OFF_TIMEOUT, time); } // override home buttons @Override public void onAttachedToWindow() { if (AppSettings.OVERRIDE_HOME_BUTTONS) { //this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); } } /** * Handle the results from the recognition activity. */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == Audio.VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { // Fill the list view with the strings the recognizer thought it // could have heard ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); for (String _string : matches) { MLog.d(TAG, "" + _string); } } super.onActivityResult(requestCode, resultCode, data); } // override volume buttons @Override public boolean onKeyDown(int keyCode, KeyEvent event) { MLog.d(TAG, "" + keyCode); if (AppSettings.OVERRIDE_VOLUME_BUTTONS && (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP)) { return true; } if (keyCode == KeyEvent.KEYCODE_BACK && AppSettings.CLOSE_WITH_BACK) { finish(); return true; } return super.onKeyDown(keyCode, event); } public void superMegaForceKill() { int pid = android.os.Process.myPid(); android.os.Process.killProcess(pid); } @Override protected void onDestroy() { super.onDestroy(); System.gc(); } @Override protected void onResume() { System.gc(); super.onResume(); } @Override protected void onPause() { super.onPause(); System.gc(); } }