/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package info.guardianproject.gilga; import info.guardianproject.gilga.model.StatusAdapter; import info.guardianproject.gilga.service.GilgaService; import java.io.File; import android.app.ActionBar; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.bluetooth.BluetoothAdapter; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; /** * This is the main Activity that displays the current chat session. */ public class GilgaMeshActivity extends Activity { // Debugging private static final String TAG = "GILGA"; private static final boolean D = true; // Key names received from the BluetoothChatService Handler public static final String DEVICE_NAME = "device_name"; public static final String TOAST = "toast"; // Intent request codes private static final int REQUEST_ENABLE_BT = 3; private boolean mRepeaterMode = false; private String mLocalAddress = null; private Handler mHandler = new Handler(); //for posting delayed events @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set up the window layout setContentView(R.layout.main); initData(); checkBluetooth(); setupTabbedBar(); handleIntent(); } private void handleIntent () { Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared TextView tvStatus = ((TextView) findViewById(R.id.edit_text_out)); tvStatus.append(sharedText); } } } } private void initData () { //these adapters are a totally short-term hack! :) if (GilgaApp.mStatusAdapter == null) GilgaApp.mStatusAdapter = new StatusAdapter(this); if (GilgaApp.mFavAdapter == null) GilgaApp.mFavAdapter = new StatusAdapter(this); } public BluetoothAdapter checkBluetooth () { // Get local Bluetooth adapter BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); // If the adapter is null, then Bluetooth is not supported if (bluetoothAdapter == null) { Toast.makeText(this, R.string.please_enable_bluetooth_to_use_this_app, Toast.LENGTH_LONG).show(); finish(); return null; } // If BT is not on and discoverable, request to make it so - // setupChat() will then be called during onActivityResult if (!bluetoothAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } else { mLocalAddress = GilgaService.mapToNickname(bluetoothAdapter.getAddress()); resetTitle(); Intent intent = new Intent(this, GilgaService.class); intent.putExtra("listen", true); startService(intent); } return bluetoothAdapter; } private void setupTabbedBar () { final ActionBar actionBar = getActionBar(); // Specify that tabs should be displayed in the action bar. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Create a tab listener that is called when the user changes tabs. ActionBar.TabListener tabListener = new ActionBar.TabListener() { public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { switch (tab.getPosition()) { case 0: showStatus(); ((ListView) findViewById(R.id.statusList)).setAdapter(GilgaApp.mStatusAdapter); break; case 1: showStatus(); ((ListView) findViewById(R.id.statusList)).setAdapter(GilgaApp.mFavAdapter); break; case 2: showNearby(); break; case 3: showInfo(); break; default: } } public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { // hide the given tab } public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { // probably ignore this event } }; // Add 3 tabs, specifying the tab's text and TabListener actionBar.addTab( actionBar.newTab() //.setIcon(android.R.drawable.ic_dialog_alert) .setText(R.string.status) .setTabListener(tabListener)); actionBar.addTab( actionBar.newTab() //.setIcon(android.R.drawable.ic_dialog_alert) .setText(R.string.favs) .setTabListener(tabListener)); actionBar.addTab( actionBar.newTab() //.setIcon(android.R.drawable.ic_dialog_alert) .setText(R.string.nearby) .setTabListener(tabListener)); actionBar.addTab( actionBar.newTab() //.setIcon(android.R.drawable.ic_dialog_alert) .setText(R.string.info) .setTabListener(tabListener)); } private void showStatus () { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.show(fm.findFragmentById(R.id.status_list)); ft.hide(fm.findFragmentById(R.id.device_list)); ft.hide(fm.findFragmentById(R.id.info_screen)); ft.commit(); } private void showNearby () { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.hide(fm.findFragmentById(R.id.status_list)); ft.hide(fm.findFragmentById(R.id.info_screen)); ft.show(fm.findFragmentById(R.id.device_list)); ft.commit(); } private void showInfo () { FragmentManager fm = getFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.hide(fm.findFragmentById(R.id.status_list)); ft.show(fm.findFragmentById(R.id.info_screen)); ft.hide(fm.findFragmentById(R.id.device_list)); ft.commit(); } @Override public void onStart() { super.onStart(); } @Override public synchronized void onResume() { super.onResume(); } @Override public synchronized void onPause() { super.onPause(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } public void onActivityResult(int requestCode, int resultCode, Intent data) { if(D) Log.d(TAG, "onActivityResult " + resultCode); switch (requestCode) { case REQUEST_ENABLE_BT: if (resultCode == Activity.RESULT_OK) { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mLocalAddress = GilgaService.mapToNickname(bluetoothAdapter.getAddress()); resetTitle(); Intent intent = new Intent(this, GilgaService.class); intent.putExtra("listen", true); startService(intent); } break; /* case REQUEST_CONNECT_DEVICE:Br // When DeviceListActivity returns with a device to connect if (resultCode == Activity.RESULT_OK) { if (mChatService != null) { // Only if the state is STATE_NONE, do we know that we haven't started already if (mChatService.getState() == BluetoothChatService.STATE_NONE) { // Start the Bluetooth chat services mChatService.start(); } } // Get the device MAC address String address = data.getExtras() .getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS); connectDevice(address); } break; */ } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.option_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { Intent serverIntent = null; switch (item.getItemId()) { case R.id.share_app: shareAPKFile(); break; case R.id.shutdown_app: shutdown(); break; case R.id.toggle_visibility: toggleVisibility(false); break; case R.id.toggle_repeater: toggleRepeater(); break; } return false; } public void toggleVisibility (boolean forceVisible) { final BluetoothAdapter bluetoothAdapter = checkBluetooth(); if (bluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 3600); startActivity(discoverableIntent); } else if (!forceVisible) { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 1); startActivity(discoverableIntent); } mHandler.postDelayed(new Runnable () { public void run () { resetTitle(); } },5000); } private void resetTitle () { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter.getScanMode() == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { setTitle(getString(R.string.app_name) + " @" + mLocalAddress); } else setTitle(getString(R.string.app_name) + ": " + getString(R.string.listen_mode)); } private void toggleRepeater () { mRepeaterMode = !mRepeaterMode; Intent intent = new Intent(this, GilgaService.class); intent.putExtra("repeat", mRepeaterMode); startService(intent); } private void shutdown () { Intent intent = new Intent(this, GilgaService.class); stopService(intent); finish(); } private void shareAPKFile () { PackageManager pm = getPackageManager(); // String thisPkgId = pm.getPackageInfo(getPackageName(), 0).packageName; String uri = null; for (ApplicationInfo app : pm.getInstalledApplications(0)) { if(!((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1)) if(!((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1)){ uri=app.sourceDir; if(uri.contains(getPackageName())) break; } } Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); // intent.setPackage("com.android.bluetooth"); //let's not limit it to Bluetooth... who knows how you might want to share a file! intent.setType("*/*"); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(uri))); startActivity(intent); } }