Java tutorial
/* * Copyright (C) 2013 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 com.sdingba.su.lanya; import java.io.UnsupportedEncodingException; import java.text.DateFormat; import java.util.Date; import android.app.Activity; import android.app.AlertDialog; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.res.Configuration; import android.media.Ringtone; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.Gravity; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener { private static final int REQUEST_SELECT_DEVICE = 1; private static final int REQUEST_ENABLE_BT = 2; private static final int UART_PROFILE_READY = 10; public static final String TAG = "nRFUART"; private static final int UART_PROFILE_CONNECTED = 20; private static final int UART_PROFILE_DISCONNECTED = 21; private static final int STATE_OFF = 10; // TextView mRemoteRssiVal; // RadioGroup mRg; private Button btnConnectDisconnect, btnSend; private EditText edtMessage; private int mState = UART_PROFILE_DISCONNECTED; private UartService mService = null; private BluetoothDevice mDevice = null; private BluetoothAdapter mBtAdapter = null; private ListView messageListView; private ArrayAdapter<String> listAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBtAdapter == null) { // Toast.makeText(this, "Bluetooth is not available", Toast.LENGTH_LONG).show(); Toast.makeText(this, " Bluetooth is not available------Bluetooth ??", Toast.LENGTH_LONG) .show(); finish(); return; } // showMessage("??"); messageListView = (ListView) findViewById(R.id.listMessage); listAdapter = new ArrayAdapter<String>(this, R.layout.message_detail); messageListView.setAdapter(listAdapter); messageListView.setDivider(null); btnConnectDisconnect = (Button) findViewById(R.id.btn_select); btnSend = (Button) findViewById(R.id.sendButton); edtMessage = (EditText) findViewById(R.id.sendText); service_init(); // Handler Disconnect & Connect button btnConnectDisconnect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!mBtAdapter.isEnabled()) { // mBtAdapter.isEnabled() == null ?? // // showMessage("mBtAdapter.isEnabled() = "+mBtAdapter.isEnabled()); //mBtAdapter.isEnabled()::::Return true if Bluetooth is currently enabled and ready for use. //Equivalent to: getBluetoothState() == STATE_ON Log.i(TAG, "onClick - BT not enabled yet"); Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } else { //TODO BUG //// TODO: 16-6-5 ??? ? // Connect ?? listView showMessage(" ??" + mState + " " + " 21 = UART_PROFILE_DISCONNECTED ; 20 = connection"); if (btnConnectDisconnect.getText().equals("Connect")) { //Connect button pressed, open DeviceListActivity // class, with popup windows that scan for devices // showMessage(" =-=======-= "); Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class); startActivityForResult(newIntent, REQUEST_SELECT_DEVICE); } else { showMessage(" ******** "); //Disconnect button pressed if (mDevice != null) { mService.disconnect(); } } } } }); //// TODO: 16-6-13 ] ? ? //?? // Handler Send button btnSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText editText = (EditText) findViewById(R.id.sendText); String message = editText.getText().toString(); byte[] value; try { //send data to service value = message.getBytes("UTF-8"); mService.writeRXCharacteristic(value); //Update the log with time stamp String currentDateTimeString = DateFormat.getTimeInstance().format(new Date()); listAdapter.add("[" + currentDateTimeString + "] TX: " + message); messageListView.smoothScrollToPosition(listAdapter.getCount() - 1); edtMessage.setText(""); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); // Set initial UI state } /** * ? */ private void service_init() { //? Intent bindIntent = new Intent(this, UartService.class); bindService(bindIntent, mServiceConnection, Context.BIND_AUTO_CREATE); LocalBroadcastManager.getInstance(this).registerReceiver(UARTStatusChangeReceiver, makeGattUpdateIntentFilter()); } /** * IntentFilter * @return */ private static IntentFilter makeGattUpdateIntentFilter() { final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(UartService.ACTION_GATT_CONNECTED); intentFilter.addAction(UartService.ACTION_GATT_DISCONNECTED); intentFilter.addAction(UartService.ACTION_GATT_SERVICES_DISCOVERED); intentFilter.addAction(UartService.ACTION_DATA_AVAILABLE); intentFilter.addAction(UartService.DEVICE_DOES_NOT_SUPPORT_UART); return intentFilter; } //UART service connected/disconnected private ServiceConnection mServiceConnection = new ServiceConnection() { //4. ? ?? public void onServiceConnected(ComponentName className, IBinder rawBinder) { //? mService = ((UartService.LocalBinder) rawBinder).getService(); Log.d(TAG, "onServiceConnected mService= " + mService); if (!mService.initialize()) { Log.e(TAG, "Unable to initialize Bluetooth"); finish(); } } //??? public void onServiceDisconnected(ComponentName classname) { //// mService.disconnect(mDevice); mService = null; } }; // private Handler mHandler = new Handler() { // @Override // //Handler events that received from UART service // public void handleMessage(Message msg) { // } // }; private final BroadcastReceiver UARTStatusChangeReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); final Intent mIntent = intent; //********** ? ***********// if (action.equals(UartService.ACTION_GATT_CONNECTED)) { runOnUiThread(new Runnable() { public void run() { String currentDateTimeString = DateFormat.getTimeInstance().format(new Date()); Log.d(TAG, "UART_CONNECT_MSG"); btnConnectDisconnect.setText("Disconnect"); edtMessage.setEnabled(true); btnSend.setEnabled(true); ((TextView) findViewById(R.id.deviceName)).setText(mDevice.getName() + " - ready"); listAdapter.add("[" + currentDateTimeString + "] Connected to: " + mDevice.getName()); messageListView.smoothScrollToPosition(listAdapter.getCount() - 1); mState = UART_PROFILE_CONNECTED; } }); } //*********** **********// if (action.equals(UartService.ACTION_GATT_DISCONNECTED)) { runOnUiThread(new Runnable() { public void run() { String currentDateTimeString = DateFormat.getTimeInstance().format(new Date()); Log.d(TAG, "UART_DISCONNECT_MSG"); btnConnectDisconnect.setText("Connect"); edtMessage.setEnabled(false); btnSend.setEnabled(false); ((TextView) findViewById(R.id.deviceName)).setText("Not Connected"); listAdapter.add("[" + currentDateTimeString + "] Disconnected to: " + mDevice.getName()); mState = UART_PROFILE_DISCONNECTED; mService.close(); //setUiState(); } }); } //*********************// if (action.equals(UartService.ACTION_GATT_SERVICES_DISCOVERED)) { mService.enableTXNotification(); Log.d(TAG, "SDingBaLanYan : ====ACTION_GATT_SERVICdddddddES_DISCOVERED"); } //*********** ? ??**********// //*********** ? ??**********// //*********** ? ??**********// //*********** ? ??**********// //*********** ? ??**********// if (action.equals(UartService.ACTION_DATA_AVAILABLE)) { final byte[] txValue = intent.getByteArrayExtra(UartService.EXTRA_DATA); runOnUiThread(new Runnable() { public void run() { try { String text = new String(txValue, "UTF-8"); String currentDateTimeString = DateFormat.getTimeInstance().format(new Date()); listAdapter.add("[" + currentDateTimeString + "] RX: " + text); messageListView.smoothScrollToPosition(listAdapter.getCount() - 1); } catch (Exception e) { Log.e(TAG, e.toString()); } } }); } //******** ?? *************// if (action.equals(UartService.DEVICE_DOES_NOT_SUPPORT_UART)) { // TODO: 16-6-5 ????? showMessage("???Device doesn't support UART. Disconnecting ?????"); //// TODO: 16-6-5 disconnect?? mService.disconnect(); } } }; @Override public void onStart() { super.onStart(); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy()"); // if (UARTStatusChangeReceiver != null) { try { LocalBroadcastManager.getInstance(this).unregisterReceiver(UARTStatusChangeReceiver); } catch (Exception ignore) { Log.e(TAG, ignore.toString()); } // } // TODO: 16-6-6 ? unbindService(mServiceConnection); mService.stopSelf(); mService = null; } @Override protected void onStop() { Log.d(TAG, "onStop"); super.onStop(); } @Override protected void onPause() { Log.d(TAG, "onPause"); super.onPause(); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart"); } @Override public void onResume() { super.onResume(); Log.d(TAG, "onResume"); Log.d(TAG, "onResume : " + mBtAdapter.isEnabled()); if (!mBtAdapter.isEnabled()) { showMessage("onResume : " + mBtAdapter.isEnabled()); showMessage("onResume : mBtAdapter.isEnabled() is :" + mBtAdapter.isEnabled()); Log.i(TAG, "onResume - BT not enabled yet"); Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_SELECT_DEVICE: //When the DeviceListActivity return, with the selected device address if (resultCode == Activity.RESULT_OK && data != null) { //??? String deviceAddress = data.getStringExtra(BluetoothDevice.EXTRA_DEVICE); mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress); Log.d(TAG, "... onActivityResultdevice.address==" + mDevice + "mserviceValue" + mService); ((TextView) findViewById(R.id.deviceName)).setText(mDevice.getName() + " - connecting"); mService.connect(deviceAddress); } break; case REQUEST_ENABLE_BT: // When the request to enable Bluetooth returns if (resultCode == Activity.RESULT_OK) { Toast.makeText(this, "Bluetooth has turned on for onActivityResult ", Toast.LENGTH_SHORT).show(); } else { // User did not enable Bluetooth or an error occurred Log.d(TAG, "BT not enabled"); Toast.makeText(this, "Problem in BT Turning ON for onActivityResult", Toast.LENGTH_SHORT).show(); Log.i(TAG, "finish(); is acticiyty"); finish(); } break; default: Log.e(TAG, "wrong request code"); break; } } @Override public void onCheckedChanged(RadioGroup group, int checkedId) { } private void showMessage(String msg) { Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); } @Override public void onBackPressed() { if (mState == UART_PROFILE_CONNECTED) { Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain); showMessage("onBackPressed : nRFUART's running in background.\n " + " Disconnect to exit"); } else { new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.popup_title) .setMessage(R.string.popup_message) .setPositiveButton(R.string.popup_yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }).setNegativeButton(R.string.popup_no, null).show(); } } }