MainActivity.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. package de.tudarmstadt.informatik.hostage.ui2.activity;
  2. import android.app.ActionBar;
  3. import android.app.Activity;
  4. import android.app.ActivityManager;
  5. import android.app.Fragment;
  6. import android.app.FragmentManager;
  7. import android.app.FragmentTransaction;
  8. import android.content.BroadcastReceiver;
  9. import android.content.ComponentName;
  10. import android.content.Context;
  11. import android.content.Intent;
  12. import android.content.IntentFilter;
  13. import android.content.ServiceConnection;
  14. import android.content.pm.ActivityInfo;
  15. import android.content.res.Configuration;
  16. import android.content.res.TypedArray;
  17. import android.os.Bundle;
  18. import android.os.IBinder;
  19. import android.support.v4.app.ActionBarDrawerToggle;
  20. import android.support.v4.content.LocalBroadcastManager;
  21. import android.support.v4.widget.DrawerLayout;
  22. import android.util.Log;
  23. import android.view.MenuItem;
  24. import android.view.View;
  25. import android.widget.AdapterView;
  26. import android.widget.ListView;
  27. import java.io.BufferedReader;
  28. import java.io.InputStreamReader;
  29. import java.util.ArrayList;
  30. import java.util.HashMap;
  31. import de.tudarmstadt.informatik.hostage.HoneyService;
  32. import de.tudarmstadt.informatik.hostage.R;
  33. import de.tudarmstadt.informatik.hostage.ui.LogFilter;
  34. import de.tudarmstadt.informatik.hostage.ui2.adapter.DrawerListAdapter;
  35. import de.tudarmstadt.informatik.hostage.ui2.fragment.AboutFragment;
  36. import de.tudarmstadt.informatik.hostage.ui2.fragment.HomeFragment;
  37. import de.tudarmstadt.informatik.hostage.ui2.fragment.ProfileManagerFragment;
  38. import de.tudarmstadt.informatik.hostage.ui2.fragment.RecordOverviewFragment;
  39. import de.tudarmstadt.informatik.hostage.ui2.fragment.ServicesFragment;
  40. import de.tudarmstadt.informatik.hostage.ui2.fragment.SettingsFragment;
  41. import de.tudarmstadt.informatik.hostage.ui2.fragment.StatisticsFragment;
  42. import de.tudarmstadt.informatik.hostage.ui2.fragment.ThreatMapFragment;
  43. import de.tudarmstadt.informatik.hostage.ui2.fragment.opengl.ThreatIndicatorGLRenderer;
  44. import de.tudarmstadt.informatik.hostage.ui2.model.DrawerListItem;
  45. /**
  46. * @author Alexander Brakowski
  47. * @created 12.01.14 23:24
  48. */
  49. public class MainActivity extends Activity {
  50. public static volatile Context context;
  51. public static boolean isRooted = false;
  52. public static boolean porthackInstalled = false;
  53. /** singleton instance of the MainActivity **/
  54. private static MainActivity sInstance = null;
  55. public Fragment mDisplayedFragment;
  56. public HoneyService mHoneyService;
  57. private DrawerLayout mDrawerLayout;
  58. private ListView mDrawerList;
  59. private ActionBarDrawerToggle mDrawerToggle;
  60. private CharSequence mDrawerTitle;
  61. private CharSequence mTitle;
  62. private MainMenuItem mSelectedMenuItem = null;
  63. private ArrayList<DrawerListItem> mDrawerItems;
  64. private boolean mServiceBound = false;
  65. /**
  66. * Connection to bind the background service
  67. *
  68. * @see HoneyService
  69. */
  70. private ServiceConnection mConnection = new ServiceConnection() {
  71. /**
  72. * After the service is bound, check which has been clicked and start
  73. * it.
  74. *
  75. * @see android.content.ServiceConnection#onServiceConnected(android.content.ComponentName, android.os.IBinder)
  76. */
  77. @Override
  78. public void onServiceConnected(ComponentName name, IBinder service) {
  79. mHoneyService = ((HoneyService.LocalBinder) service).getService();
  80. mServiceBound = true;
  81. }
  82. /**
  83. * After the service is unbound, delete reference.
  84. *
  85. * @see android.content.ServiceConnection#onServiceDisconnected(android.content.ComponentName)
  86. */
  87. @Override
  88. public void onServiceDisconnected(ComponentName name) {
  89. mHoneyService = null;
  90. mServiceBound = false;
  91. }
  92. };
  93. private boolean mInvalidMenuItem = false;
  94. private HashMap<String, Boolean> mAttacksOnProtocol;
  95. /**
  96. * Retrieve the singleton latest instance of the activity
  97. * @return MainActivity - the singleton instance
  98. */
  99. public static MainActivity getInstance(){
  100. assert(sInstance != null);
  101. return sInstance;
  102. }
  103. public static Context getContext(){
  104. return MainActivity.context;
  105. }
  106. @Override
  107. public void onStart(){
  108. super.onStart();
  109. registerReceiver();
  110. if(isServiceRunning()){
  111. this.bindService();
  112. }
  113. }
  114. @Override
  115. protected void onStop() {
  116. // Unregister Broadcast Receiver
  117. unregisterReceiver();
  118. super.onStop();
  119. }
  120. @Override
  121. protected void onCreate(Bundle savedInstanceState) {
  122. super.onCreate(savedInstanceState);
  123. sInstance = this;
  124. MainActivity.context = getApplicationContext();
  125. setContentView(R.layout.activity_drawer_main);
  126. ThreatIndicatorGLRenderer.assets = getAssets();
  127. ThreatIndicatorGLRenderer.setThreatLevel(ThreatIndicatorGLRenderer.ThreatLevel.NOT_MONITORING);
  128. // set background color
  129. TypedArray arr = getTheme().obtainStyledAttributes(
  130. new int[] { android.R.color.background_light });
  131. ThreatIndicatorGLRenderer.setBackgroundColor(arr.getColor(0, 0xFFFFFF));
  132. arr.recycle();
  133. ActionBar actionBar = getActionBar();
  134. actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE
  135. | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP);
  136. mTitle = mDrawerTitle = getTitle();
  137. mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
  138. mDrawerList = (ListView) findViewById(R.id.left_drawer);
  139. mDrawerItems = new ArrayList<DrawerListItem>();
  140. mDrawerItems.add(new DrawerListItem(R.string.drawer_overview, R.drawable.ic_menu_home));
  141. mDrawerItems.add(new DrawerListItem(R.string.drawer_threat_map, R.drawable.ic_menu_mapmode));
  142. mDrawerItems.add(new DrawerListItem(R.string.drawer_records, R.drawable.ic_menu_records));
  143. mDrawerItems.add(new DrawerListItem(R.string.drawer_statistics, R.drawable.ic_menu_stats));
  144. mDrawerItems.add(new DrawerListItem(R.string.drawer_services, R.drawable.ic_menu_set_as));
  145. mDrawerItems.add(
  146. new DrawerListItem(R.string.drawer_profile_manager, R.drawable.ic_menu_allfriends));
  147. mDrawerItems.add(
  148. new DrawerListItem(R.string.drawer_settings, R.drawable.ic_menu_preferences));
  149. mDrawerItems.add(
  150. new DrawerListItem(R.string.drawer_app_info, R.drawable.ic_menu_info_details));
  151. DrawerListAdapter listAdapter = new DrawerListAdapter(this, mDrawerItems);
  152. mDrawerList.setAdapter(listAdapter);
  153. mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
  154. getActionBar().setDisplayHomeAsUpEnabled(true);
  155. getActionBar().setHomeButtonEnabled(true);
  156. getActionBar().setDisplayShowHomeEnabled(true);
  157. mDrawerToggle = new ActionBarDrawerToggle(
  158. this, /* host Activity */
  159. mDrawerLayout, /* DrawerLayout object */
  160. R.drawable.ic_navigation_drawer, /* nav drawer image to replace 'Up' caret */
  161. R.string.drawer_open, /* "open drawer" description for accessibility */
  162. R.string.drawer_close /* "close drawer" description for accessibility */
  163. ) {
  164. public void onDrawerClosed(View view) {
  165. getActionBar().setTitle(mTitle);
  166. invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
  167. }
  168. public void onDrawerOpened(View drawerView) {
  169. getActionBar().setTitle(mDrawerTitle);
  170. invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
  171. }
  172. };
  173. mDrawerLayout.setDrawerListener(mDrawerToggle);
  174. checkRootAndPorthack();
  175. startAndBind();
  176. if (savedInstanceState == null) {
  177. // on first time display view for first nav item
  178. displayView(0);
  179. }
  180. }
  181. private void registerReceiver() {
  182. LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver,
  183. new IntentFilter(getString(R.string.broadcast)));
  184. }
  185. private void unregisterReceiver() {
  186. LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
  187. }
  188. private BroadcastReceiver mReceiver = new BroadcastReceiver() {
  189. @Override
  190. public void onReceive(Context context, Intent intent) {
  191. }
  192. };
  193. public void startAndBind() {
  194. if(!isServiceRunning()){
  195. startService(getServiceIntent());
  196. }
  197. bindService();
  198. }
  199. public void stopAndUnbind() {
  200. if(mServiceBound){
  201. unbindService();
  202. }
  203. stopService(getServiceIntent());
  204. }
  205. public void unbindService() {
  206. try {
  207. unbindService(mConnection);
  208. } catch(IllegalArgumentException ex){
  209. // somehow already unbound.
  210. } finally {
  211. mServiceBound = false;
  212. }
  213. }
  214. public void bindService() {
  215. bindService(getServiceIntent(), mConnection, BIND_AUTO_CREATE);
  216. //mServiceBound = true;
  217. }
  218. @Override
  219. protected void onDestroy() {
  220. // Unbind running service
  221. if(!mHoneyService.hasRunningListeners()){
  222. stopAndUnbind();
  223. }
  224. super.onDestroy();
  225. }
  226. @Override
  227. public boolean onOptionsItemSelected(MenuItem item) {
  228. // toggle nav drawer on selecting action bar app icon/title
  229. if (mDrawerToggle.onOptionsItemSelected(item)) {
  230. return true;
  231. }
  232. if(item.getItemId() == android.R.id.home){
  233. if(!mDrawerToggle.isDrawerIndicatorEnabled()){
  234. if(getFragmentManager().getBackStackEntryCount() > 0) getFragmentManager().popBackStack();
  235. if(getCurrentFragment().getTag() != null) mDrawerToggle.setDrawerIndicatorEnabled(true);
  236. return true;
  237. }
  238. }
  239. return super.onOptionsItemSelected(item);
  240. }
  241. @Override
  242. public void setTitle(CharSequence title) {
  243. mTitle = title;
  244. getActionBar().setTitle(mTitle);
  245. }
  246. /**
  247. * When using the ActionBarDrawerToggle, you must call it during
  248. * onPostCreate() and onConfigurationChanged()...
  249. */
  250. @Override
  251. protected void onPostCreate(Bundle savedInstanceState) {
  252. super.onPostCreate(savedInstanceState);
  253. // Sync the toggle state after onRestoreInstanceState has occurred.
  254. mDrawerToggle.syncState();
  255. }
  256. @Override
  257. public void onConfigurationChanged(Configuration newConfig) {
  258. super.onConfigurationChanged(newConfig);
  259. // Pass any configuration change to the drawer toggls
  260. mDrawerToggle.onConfigurationChanged(newConfig);
  261. }
  262. public Fragment getCurrentFragment() {
  263. return this.mDisplayedFragment;
  264. }
  265. public void displayView(int position) {
  266. if(mSelectedMenuItem != null && position == mSelectedMenuItem.value && !mInvalidMenuItem) {
  267. mDrawerLayout.closeDrawer(mDrawerList);
  268. return;
  269. }
  270. // DONT OPEN SAME VIEW AGAIN
  271. mInvalidMenuItem = false;
  272. MainMenuItem menuItemPosition = mSelectedMenuItem = MainMenuItem.create(position);
  273. Fragment fragment = null;
  274. // set orientation fixed to portrait in home fragment
  275. if(menuItemPosition == MainMenuItem.HOME){
  276. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT | ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
  277. } else {
  278. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
  279. }
  280. // update the main content by replacing fragments
  281. switch (menuItemPosition) {
  282. case HOME:
  283. fragment = new HomeFragment();
  284. break;
  285. case THREAT_MAP:
  286. fragment = new ThreatMapFragment();
  287. break;
  288. case RECORDS:{
  289. Intent intent = this.getIntent();
  290. intent.removeExtra(LogFilter.LOG_FILTER_INTENT_KEY);
  291. fragment = new RecordOverviewFragment();
  292. break;
  293. }
  294. case STATISTICS: {
  295. Intent intent = this.getIntent();
  296. intent.removeExtra(LogFilter.LOG_FILTER_INTENT_KEY);
  297. fragment = new StatisticsFragment();
  298. break;
  299. }
  300. case SERVICES:
  301. fragment = new ServicesFragment();
  302. break;
  303. case PROFILE_MANAGER:
  304. fragment = new ProfileManagerFragment();
  305. break;
  306. case SETTINGS:
  307. fragment = new SettingsFragment();
  308. break;
  309. case APPLICATION_INFO:
  310. fragment = new AboutFragment();
  311. break;
  312. default:
  313. break;
  314. }
  315. if (fragment != null) {
  316. // update selected item and title, then close the drawer if needed
  317. injectFragment(fragment, false, menuItemPosition);
  318. mDrawerList.setItemChecked(position, true);
  319. mDrawerList.setSelection(position);
  320. setTitle(mDrawerItems.get(position).text);
  321. }
  322. mDrawerLayout.closeDrawer(mDrawerList);
  323. }
  324. public void injectFragment(Fragment fragment, boolean enableBack){
  325. injectFragment(fragment, enableBack, null);
  326. }
  327. private void injectFragment(Fragment fragment, boolean enableBack, Object tagObj){
  328. if(enableBack){
  329. mDrawerToggle.setDrawerIndicatorEnabled(false);
  330. }
  331. String tag = (tagObj == null ? null : tagObj.toString());
  332. FragmentManager fragmentManager = getFragmentManager();
  333. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  334. fragmentTransaction.replace(R.id.content_frame, fragment, tag);
  335. if(tagObj == null || !(fragmentManager.getBackStackEntryCount() == 0 && tagObj.equals(MainMenuItem.HOME))) fragmentTransaction.addToBackStack(tag);
  336. fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
  337. fragmentTransaction.commit();
  338. this.mDisplayedFragment = fragment;
  339. if(tagObj == null){
  340. this.mInvalidMenuItem = true;
  341. }
  342. }
  343. @Override
  344. public void onBackPressed() {
  345. super.onBackPressed();
  346. if(getCurrentFragment().getTag() != null) mDrawerToggle.setDrawerIndicatorEnabled(true);
  347. }
  348. public static void displayBackStack(FragmentManager fm) {
  349. int count = fm.getBackStackEntryCount();
  350. Log.d("Backstack log", "There are " + count + " entries");
  351. for(int i = 0; i<count; i++) {
  352. // Display Backstack-entry data like
  353. String name = fm.getBackStackEntryAt(i).getName();
  354. Log.d("Backstack log", "entry " + i + ": " + name);
  355. }
  356. }
  357. public Intent getServiceIntent() {
  358. return new Intent(this, HoneyService.class);
  359. }
  360. public Fragment getDisplayedFragment() {
  361. return this.mDisplayedFragment;
  362. }
  363. /**
  364. * Checks if the phone ist rooted and if porthack is installed. Sets flags
  365. * {@link this.isRooted} and {@link this.porthackInstalled}
  366. */
  367. private void checkRootAndPorthack() {
  368. isRooted = false;
  369. porthackInstalled = false;
  370. Process p;
  371. try {
  372. String found = "Found";
  373. String notFound = "Not found";
  374. String command = "[ -f /data/local/p ] && echo " + found
  375. + " || echo " + notFound;
  376. p = Runtime.getRuntime().exec(new String[] { "su", "-c", command });
  377. BufferedReader in = new BufferedReader(new InputStreamReader(
  378. p.getInputStream()));
  379. /*
  380. * int av = byte[] b = new byte[av]; if (av != 0) { in.read(b); }
  381. */
  382. String echoResponse = in.readLine();
  383. Log.i("MainAc", echoResponse);
  384. if (echoResponse.equals(found)) {
  385. isRooted = true;
  386. porthackInstalled = true;
  387. } else if (echoResponse.equals(notFound)) {
  388. isRooted = true;
  389. }
  390. } catch (Exception e) {
  391. e.printStackTrace();
  392. }
  393. Log.i("MainAc", "Rooted: " + isRooted + " Porthack: "
  394. + porthackInstalled);
  395. }
  396. public HoneyService getHoneyService(){
  397. return this.mHoneyService;
  398. }
  399. public boolean isServiceBound(){
  400. return this.mServiceBound;
  401. }
  402. public boolean isServiceRunning() {
  403. ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  404. for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(
  405. Integer.MAX_VALUE)) {
  406. if (service.service.getClassName().equals(
  407. HoneyService.class.getName())) {
  408. return true;
  409. }
  410. }
  411. return false;
  412. }
  413. public enum MainMenuItem {
  414. HOME(0),
  415. THREAT_MAP(1),
  416. RECORDS(2),
  417. STATISTICS(3),
  418. SERVICES(4),
  419. PROFILE_MANAGER(5),
  420. SETTINGS(6),
  421. APPLICATION_INFO(7);
  422. private int value;
  423. private MainMenuItem(int value) {
  424. this.value = value;
  425. }
  426. static public MainMenuItem create(int value){
  427. if (value < 0 || value >= MainMenuItem.values().length) return MainMenuItem.HOME;
  428. return MainMenuItem.values()[value];
  429. }
  430. public int getValue() {
  431. return value;
  432. }
  433. }
  434. private class DrawerItemClickListener implements ListView.OnItemClickListener {
  435. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  436. displayView(position);
  437. }
  438. }
  439. }