Merge "[Telephony] Use TelephonyCallback instead of PhoneStateListener part4"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 488326c..a6c1ec5 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -100,6 +100,7 @@
<protected-broadcast android:name= "android.intent.action.SUBSCRIPTION_INFO_RECORD_ADDED" />
<protected-broadcast android:name= "android.intent.action.ACTION_MANAGED_ROAMING_IND" />
+ <protected-broadcast android:name= "android.intent.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE" />
<!-- Allows granting runtime permissions to telephony related components. -->
<uses-permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS" />
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index d7594e9..05ed622 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -6913,15 +6913,6 @@
}
@Override
- public void setRadioCapability(RadioAccessFamily[] rafs) {
- try {
- ProxyController.getInstance().setRadioCapability(rafs);
- } catch (RuntimeException e) {
- Log.w(LOG_TAG, "setRadioCapability: Runtime Exception");
- }
- }
-
- @Override
public int getRadioAccessFamily(int phoneId, String callingPackage) {
Phone phone = PhoneFactory.getPhone(phoneId);
try {
@@ -9631,10 +9622,10 @@
* Register RCS provisioning callback.
*/
@Override
- public void registerRcsProvisioningChangedCallback(int subId,
+ public void registerRcsProvisioningCallback(int subId,
IRcsConfigCallback callback) {
TelephonyPermissions.enforceAnyPermissionGrantedOrCarrierPrivileges(mApp, subId,
- Binder.getCallingUid(), "registerRcsProvisioningChangedCallback",
+ Binder.getCallingUid(), "registerRcsProvisioningCallback",
Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION,
permission.READ_PRIVILEGED_PHONE_STATE);
@@ -9649,7 +9640,7 @@
final long identity = Binder.clearCallingIdentity();
try {
if (!RcsProvisioningMonitor.getInstance()
- .registerRcsProvisioningChangedCallback(subId, callback)) {
+ .registerRcsProvisioningCallback(subId, callback)) {
throw new ServiceSpecificException(ImsException.CODE_ERROR_UNSUPPORTED_OPERATION,
"Service not available for the subscription.");
}
@@ -9662,10 +9653,10 @@
* Unregister RCS provisioning callback.
*/
@Override
- public void unregisterRcsProvisioningChangedCallback(int subId,
+ public void unregisterRcsProvisioningCallback(int subId,
IRcsConfigCallback callback) {
TelephonyPermissions.enforceAnyPermissionGrantedOrCarrierPrivileges(mApp, subId,
- Binder.getCallingUid(), "unregisterRcsProvisioningChangedCallback",
+ Binder.getCallingUid(), "unregisterRcsProvisioningCallback",
Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION,
permission.READ_PRIVILEGED_PHONE_STATE);
@@ -9680,7 +9671,7 @@
final long identity = Binder.clearCallingIdentity();
try {
RcsProvisioningMonitor.getInstance()
- .unregisterRcsProvisioningChangedCallback(subId, callback);
+ .unregisterRcsProvisioningCallback(subId, callback);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/src/com/android/phone/RcsProvisioningMonitor.java b/src/com/android/phone/RcsProvisioningMonitor.java
index 2191e28..bcf1491 100644
--- a/src/com/android/phone/RcsProvisioningMonitor.java
+++ b/src/com/android/phone/RcsProvisioningMonitor.java
@@ -558,13 +558,13 @@
}
/**
- * Called when the application registers rcs provisioning changed callback
+ * Called when the application registers rcs provisioning callback
*/
- public boolean registerRcsProvisioningChangedCallback(int subId, IRcsConfigCallback cb) {
+ public boolean registerRcsProvisioningCallback(int subId, IRcsConfigCallback cb) {
RcsProvisioningInfo info = mRcsProvisioningInfos.get(subId);
// should not happen in normal case
if (info == null) {
- logd("fail to register rcs provisioning changed due to subscription unavailable");
+ logd("fail to register rcs provisioning callback due to subscription unavailable");
return false;
}
@@ -572,9 +572,9 @@
}
/**
- * Called when the application unregisters rcs provisioning changed callback
+ * Called when the application unregisters rcs provisioning callback
*/
- public boolean unregisterRcsProvisioningChangedCallback(int subId, IRcsConfigCallback cb) {
+ public boolean unregisterRcsProvisioningCallback(int subId, IRcsConfigCallback cb) {
RcsProvisioningInfo info = mRcsProvisioningInfos.get(subId);
// should not happen in normal case
if (info == null) {
diff --git a/testapps/TestRcsApp/TestApp/res/layout/chat_layout.xml b/testapps/TestRcsApp/TestApp/res/layout/chat_layout.xml
index 5dbf6b0..df80e54 100644
--- a/testapps/TestRcsApp/TestApp/res/layout/chat_layout.xml
+++ b/testapps/TestRcsApp/TestApp/res/layout/chat_layout.xml
@@ -4,11 +4,19 @@
android:layout_height="match_parent"
android:orientation="vertical">
+ <TextView
+ android:id="@+id/session_tips"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="15dp"
+ android:textStyle="bold" />
+
<LinearLayout
android:id="@id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:layout_below="@+id/session_tips">
<TextView
android:layout_width="wrap_content"
@@ -59,4 +67,4 @@
android:text="@string/send" />
</RelativeLayout>
-</RelativeLayout>
\ No newline at end of file
+</RelativeLayout>
diff --git a/testapps/TestRcsApp/TestApp/res/layout/contact_list.xml b/testapps/TestRcsApp/TestApp/res/layout/contact_list.xml
index 44f6d3c..eb4d1fa 100644
--- a/testapps/TestRcsApp/TestApp/res/layout/contact_list.xml
+++ b/testapps/TestRcsApp/TestApp/res/layout/contact_list.xml
@@ -4,6 +4,13 @@
android:layout_height="match_parent"
android:orientation="vertical">
+ <TextView
+ android:id="@+id/tips"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="15dp"
+ android:textStyle="bold" />
+
<Button
android:id="@+id/start_chat_btn"
android:layout_width="match_parent"
@@ -19,4 +26,4 @@
android:layout_height="match_parent"
android:layout_alignParentBottom="true" />
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/testapps/TestRcsApp/TestApp/res/layout/uce_layout.xml b/testapps/TestRcsApp/TestApp/res/layout/uce_layout.xml
index 305c88e..5cf2da2 100644
--- a/testapps/TestRcsApp/TestApp/res/layout/uce_layout.xml
+++ b/testapps/TestRcsApp/TestApp/res/layout/uce_layout.xml
@@ -44,18 +44,9 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
- android:layout_marginBottom="10dp"
android:text="@string/request_capability"
android:textAllCaps="false" />
- <TextView
- android:id="@+id/capability_result"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/result"
- android:textSize="15dp"
- android:textStyle="bold" />
-
<Button
android:id="@+id/availability_btn"
android:layout_width="match_parent"
@@ -66,11 +57,12 @@
android:textAllCaps="false" />
<TextView
- android:id="@+id/availability_result"
+ android:id="@+id/capability_result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/result"
+ android:scrollbars="vertical"
android:textSize="15dp"
android:textStyle="bold" />
</LinearLayout>
-</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml b/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml
index 3528add..a193b46 100644
--- a/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml
+++ b/testapps/TestRcsApp/TestApp/res/values/donottranslate_strings.xml
@@ -14,16 +14,18 @@
multiple ones.</string>
<string name="number">Number: </string>
<string name="request_capability">requestCapability</string>
- <string name="request_availability">requestNetworkAvailability</string>
+ <string name="request_availability">requestNetworkAvailability (1st number)</string>
<string name="gba_bootstrap">bootstrapAuthenticationRequest</string>
<string name="start_chat">Start Chat</string>
<string name="to">To:</string>
<string name="chat_message">Chat Message</string>
<string name="send">Send</string>
<string name="ok">OK</string>
- <string name="session_succeeded">Session init succeeded</string>
- <string name="session_failed">Session init failed</string>
- <string name="session_not_ready">Session not ready</string>
+ <string name="session_initiating">Initializing chat session..</string>
+ <string name="session_timeout">Session initialization timeout</string>
+ <string name="session_succeeded">Session initialization succeeded</string>
+ <string name="session_failed">Session initialization failed</string>
+ <string name="session_broken_or_not_ready">Session broken or not ready</string>
<string name="organization">Organization:</string>
<string name="uicc_type">UICC Type:</string>
<string name="protocol">Protocol:</string>
@@ -39,8 +41,12 @@
<string name="chatbot_session">Chatbot Session</string>
<string name="chatbot_standalone">Chatbot Standalone</string>
<string name="chatbot_version">Chatbot Version</string>
- <string name="provisioning_done">Provisioning Done</string>
- <string name="registration_done">Registration Done</string>
+ <string name="start_provisioning">Start Provisioning....</string>
+ <string name="provisioning_timeout">Provisioning timeout.</string>
+ <string name="provisioning_done">Provisioning done, Start registering...</string>
+ <string name="registration_timeout">Registration timeout</string>
+ <string name="registration_done">Registration done. Enjoy chat!</string>
+ <string name="registration_failed">Registration failed</string>
<string name="version_info">Version: %s</string>
<string-array name="organization">
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java
index 0531209..bb1283a 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ChatActivity.java
@@ -52,17 +52,19 @@
public static final String TELURI_PREFIX = "tel:";
private static final String TAG = "TestRcsApp.ChatActivity";
private static final int INIT_LIST = 1;
- private static final int SHOW_TOAST = 2;
+ private static final int SHOW_STATUS = 2;
private static final float TEXT_SIZE = 20.0f;
private static final int MARGIN_SIZE = 20;
+ private static final long TIMEOUT_IN_MS = 10000L;
private final ExecutorService mFixedThreadPool = Executors.newFixedThreadPool(3);
private boolean mSessionInitResult = false;
private Button mSend;
private String mDestNumber;
- private TextView mDestNumberView;
+ private TextView mDestNumberView, mTips;
private EditText mNewMessage;
private ChatObserver mChatObserver;
private Handler mHandler;
+ private int mSubId;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -80,9 +82,8 @@
case INIT_LIST:
initChatMessageLayout((Cursor) msg.obj);
break;
- case SHOW_TOAST:
- Toast.makeText(ChatActivity.this, msg.obj.toString(),
- Toast.LENGTH_SHORT).show();
+ case SHOW_STATUS:
+ mTips.setText(msg.obj.toString());
break;
default:
Log.d(TAG, "unknown msg:" + msg.what);
@@ -92,6 +93,7 @@
}
};
mDestNumberView = findViewById(R.id.destNum);
+ mTips = findViewById(R.id.session_tips);
initDestNumber();
mChatObserver = new ChatObserver(mHandler);
}
@@ -115,9 +117,9 @@
mNewMessage = findViewById(R.id.new_msg);
mSend = findViewById(R.id.chat_btn);
- int subId = SubscriptionManager.getDefaultSmsSubscriptionId();
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- Log.e(TAG, "invalid subId:" + subId);
+ mSubId = SubscriptionManager.getDefaultSmsSubscriptionId();
+ if (!SubscriptionManager.isValidSubscriptionId(mSubId)) {
+ Log.e(TAG, "invalid subId:" + mSubId);
return;
}
try {
@@ -127,42 +129,53 @@
mDestNumber = formattedNumber;
}
mDestNumberView.setText(mDestNumber);
- ChatManager.getInstance(getApplicationContext(), subId).initChatSession(
+ mTips.setText(ChatActivity.this.getResources().getString(R.string.session_initiating));
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(SHOW_STATUS,
+ ChatActivity.this.getResources().getString(R.string.session_timeout)),
+ TIMEOUT_IN_MS);
+ ChatManager.getInstance(getApplicationContext(), mSubId).initChatSession(
TELURI_PREFIX + mDestNumber, new SessionStateCallback() {
@Override
public void onSuccess() {
Log.i(TAG, "session init succeeded");
- mHandler.sendMessage(mHandler.obtainMessage(SHOW_TOAST,
- ChatActivity.this.getResources().getString(
- R.string.session_succeeded)));
+ String success = ChatActivity.this.getResources().getString(
+ R.string.session_succeeded);
+ if (mHandler.hasMessages(SHOW_STATUS)) {
+ mHandler.removeMessages(SHOW_STATUS);
+ }
+ mHandler.sendMessage(mHandler.obtainMessage(SHOW_STATUS, success));
mSessionInitResult = true;
}
@Override
public void onFailure() {
Log.i(TAG, "session init failed");
- mHandler.sendMessage(mHandler.obtainMessage(SHOW_TOAST,
- ChatActivity.this.getResources().getString(
- R.string.session_failed)));
+ String failure = ChatActivity.this.getResources().getString(
+ R.string.session_failed);
+ if (mHandler.hasMessages(SHOW_STATUS)) {
+ mHandler.removeMessages(SHOW_STATUS);
+ }
+ mHandler.sendMessage(mHandler.obtainMessage(SHOW_STATUS, failure));
mSessionInitResult = false;
}
});
mSend.setOnClickListener(view -> {
- if (!mSessionInitResult) {
+ if (!ChatManager.getInstance(getApplicationContext(), mSubId).isRegistered()
+ || !mSessionInitResult) {
Toast.makeText(ChatActivity.this,
- getResources().getString(R.string.session_not_ready),
+ getResources().getString(R.string.session_broken_or_not_ready),
Toast.LENGTH_SHORT).show();
- Log.i(TAG, "session not ready");
+ Log.i(TAG, "session broken or not ready");
return;
}
mFixedThreadPool.execute(() -> {
if (TextUtils.isEmpty(mDestNumber)) {
Log.i(TAG, "Destination number is empty");
} else {
- ChatManager.getInstance(getApplicationContext(), subId).addNewMessage(
+ ChatManager.getInstance(getApplicationContext(), mSubId).addNewMessage(
mNewMessage.getText().toString(), ChatManager.SELF, mDestNumber);
- ChatManager.getInstance(getApplicationContext(), subId).sendMessage(
+ ChatManager.getInstance(getApplicationContext(), mSubId).sendMessage(
TELURI_PREFIX + mDestNumber, mNewMessage.getText().toString());
}
});
@@ -246,16 +259,8 @@
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
- }
-
- private void dispose() {
- int subId = SubscriptionManager.getDefaultSmsSubscriptionId();
- if (!SubscriptionManager.isValidSubscriptionId(subId)) {
- Log.e(TAG, "invalid subId:" + subId);
- return;
- }
- ChatManager chatManager = ChatManager.getInstance(this, subId);
- chatManager.deregister();
+ ChatManager.getInstance(getApplicationContext(), mSubId).terminateSession(
+ TELURI_PREFIX + mDestNumber);
}
@Override
@@ -277,5 +282,4 @@
queryChatData();
}
}
-
}
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ContactListActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ContactListActivity.java
index 70715f0..b641606 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ContactListActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ContactListActivity.java
@@ -32,7 +32,6 @@
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
-import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
@@ -51,13 +50,17 @@
private static final String TAG = "TestRcsApp.ContactListActivity";
private static final int RENDER_LISTVIEW = 1;
- private static final int SHOW_TOAST = 2;
+ private static final int SHOW_STATUS = 2;
+ private static final long TIMEOUT_IN_MS = 10000L;
private final ExecutorService mSingleThread = Executors.newSingleThreadExecutor();
+ private TextView mTips;
private Button mStartChatButton;
private Handler mHandler;
private SummaryObserver mSummaryObserver;
private ArrayAdapter mAdapter;
private ListView mListview;
+ private State mState;
+ private ArrayList<ContactAttributes> mContactList;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -68,22 +71,25 @@
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
+ mContactList = new ArrayList<>();
+ mTips = findViewById(R.id.tips);
+ mListview = findViewById(R.id.listview);
mStartChatButton = findViewById(R.id.start_chat_btn);
mStartChatButton.setOnClickListener(view -> {
Intent intent = new Intent(ContactListActivity.this, PhoneNumberActivity.class);
ContactListActivity.this.startActivity(intent);
});
+ setButtonClickable(false);
mHandler = new Handler() {
public void handleMessage(Message message) {
Log.i(TAG, "handleMessage:" + message.what);
switch (message.what) {
case RENDER_LISTVIEW:
- renderListView((ArrayList<ContactAttributes>) message.obj);
+ renderListView();
break;
- case SHOW_TOAST:
- Toast.makeText(ContactListActivity.this, message.obj.toString(),
- Toast.LENGTH_SHORT).show();
+ case SHOW_STATUS:
+ mTips.setText(message.obj.toString());
break;
default:
Log.i(TAG, "unknown msg:" + message.what);
@@ -91,6 +97,7 @@
}
};
initListView();
+ initSipDelegate();
mSummaryObserver = new SummaryObserver(mHandler);
}
@@ -98,7 +105,6 @@
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
- initSipDelegate();
querySummaryData();
getContentResolver().registerContentObserver(ChatProvider.SUMMARY_URI, false,
mSummaryObserver);
@@ -130,7 +136,6 @@
private void initListView() {
Log.i(TAG, "initListView");
- mListview = findViewById(R.id.listview);
mAdapter = new ArrayAdapter<ContactAttributes>(this,
android.R.layout.simple_list_item_2,
@@ -159,28 +164,34 @@
ChatProvider.SummaryColumns.LATEST_MESSAGE,
ChatProvider.SummaryColumns.IS_READ}, null, null, null);
- ArrayList<ContactAttributes> contactList = new ArrayList<>();
+ mContactList.clear();
while (cursor.moveToNext()) {
String phoneNumber = getPhoneNumber(cursor);
String latestMessage = getLatestMessage(cursor);
boolean isRead = getIsRead(cursor);
- contactList.add(new ContactAttributes(phoneNumber, latestMessage, isRead));
+ mContactList.add(new ContactAttributes(phoneNumber, latestMessage, isRead));
}
- mHandler.sendMessage(mHandler.obtainMessage(RENDER_LISTVIEW, contactList));
+ mHandler.sendMessage(mHandler.obtainMessage(RENDER_LISTVIEW));
cursor.close();
});
}
- private void renderListView(ArrayList<ContactAttributes> contactList) {
+ private void renderListView() {
mAdapter.clear();
- mAdapter.addAll(contactList);
- mListview.setOnItemClickListener((parent, view, position, id) -> {
- Intent intent = new Intent(ContactListActivity.this, ChatActivity.class);
- intent.putExtra(ChatActivity.EXTRA_REMOTE_PHONE_NUMBER,
- contactList.get(position).phoneNumber);
- ContactListActivity.this.startActivity(intent);
- });
+ mAdapter.addAll(mContactList);
+ }
+ private void setListViewClickable(boolean clickable) {
+ if (clickable) {
+ mListview.setOnItemClickListener((parent, view, position, id) -> {
+ Intent intent = new Intent(ContactListActivity.this, ChatActivity.class);
+ intent.putExtra(ChatActivity.EXTRA_REMOTE_PHONE_NUMBER,
+ mContactList.get(position).phoneNumber);
+ ContactListActivity.this.startActivity(intent);
+ });
+ } else {
+ mListview.setOnItemClickListener(null);
+ }
}
private void initSipDelegate() {
@@ -193,21 +204,56 @@
ChatManager chatManager = ChatManager.getInstance(this, subId);
chatManager.setRcsStateChangedCallback((oldState, newState) -> {
//Show toast when provisioning or registration is done.
- if (newState == State.REGISTERING) {
- mHandler.sendMessage(mHandler.obtainMessage(SHOW_TOAST,
- ContactListActivity.this.getResources().getString(
- R.string.provisioning_done)));
- } else if (newState == State.REGISTERED) {
- mHandler.sendMessage(mHandler.obtainMessage(SHOW_TOAST,
- ContactListActivity.this.getResources().getString(
- R.string.registration_done)));
- }
+ mState = newState;
+ String tips = "";
+ String timeoutTips = "";
+ switch (newState) {
+ case PROVISIONING:
+ tips = ContactListActivity.this.getResources().getString(
+ R.string.start_provisioning);
+ mHandler.sendMessage(mHandler.obtainMessage(SHOW_STATUS, tips));
+ timeoutTips = ContactListActivity.this.getResources().getString(
+ R.string.provisioning_timeout);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(SHOW_STATUS, timeoutTips),
+ TIMEOUT_IN_MS);
+ break;
+ case REGISTERING:
+ tips = ContactListActivity.this.getResources().getString(
+ R.string.provisioning_done);
+ if (mHandler.hasMessages(SHOW_STATUS)) {
+ mHandler.removeMessages(SHOW_STATUS);
+ }
+ mHandler.sendMessage(mHandler.obtainMessage(SHOW_STATUS, tips));
+ timeoutTips = ContactListActivity.this.getResources().getString(
+ R.string.registration_timeout);
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(SHOW_STATUS, timeoutTips),
+ TIMEOUT_IN_MS);
+ break;
+ case REGISTERED:
+ tips = ContactListActivity.this.getResources().getString(
+ R.string.registration_done);
+ if (mHandler.hasMessages(SHOW_STATUS)) {
+ mHandler.removeMessages(SHOW_STATUS);
+ }
+ mHandler.sendMessage(mHandler.obtainMessage(SHOW_STATUS, tips));
+ setButtonClickable(true);
+ setListViewClickable(true);
+ break;
+ case NOT_REGISTERED:
+ tips = ContactListActivity.this.getResources().getString(
+ R.string.registration_failed);
+ mHandler.sendMessage(mHandler.obtainMessage(SHOW_STATUS, tips));
+ setButtonClickable(false);
+ setListViewClickable(false);
+ break;
+ default:
+ Log.i(TAG, "unknown state:" + newState);
+ }
});
chatManager.register();
}
-
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
@@ -230,6 +276,16 @@
return 1 == cursor.getInt(cursor.getColumnIndex(ChatProvider.SummaryColumns.IS_READ));
}
+ private void setButtonClickable(boolean clickable) {
+ if (clickable) {
+ mStartChatButton.setAlpha(1);
+ mStartChatButton.setClickable(true);
+ } else {
+ mStartChatButton.setAlpha(.5f);
+ mStartChatButton.setClickable(false);
+ }
+ }
+
class ContactAttributes {
public String phoneNumber;
public String message;
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java
index aa90487..bae4a1a 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/ProvisioningActivity.java
@@ -130,7 +130,7 @@
super.onDestroy();
this.unregisterReceiver(mSingleRegCapabilityReceiver);
if (mIsRegistered) {
- mProvisioningManager.unregisterRcsProvisioningChangedCallback(mCallback);
+ mProvisioningManager.unregisterRcsProvisioningCallback(mCallback);
}
}
@@ -157,9 +157,9 @@
Log.i(TAG, "Using configuration: " + getDefaultClientConfiguration());
try {
Log.i(TAG, "setRcsClientConfiguration()");
- Log.i(TAG, "registerRcsProvisioningChangedCallback()");
+ Log.i(TAG, "registerRcsProvisioningCallback()");
mProvisioningManager.setRcsClientConfiguration(getDefaultClientConfiguration());
- mProvisioningManager.registerRcsProvisioningChangedCallback(mExecutorService,
+ mProvisioningManager.registerRcsProvisioningCallback(mExecutorService,
mCallback);
mIsRegistered = true;
} catch (ImsException e) {
@@ -173,7 +173,7 @@
});
mUnRegisterButton.setOnClickListener(view -> {
if (mProvisioningManager != null) {
- mProvisioningManager.unregisterRcsProvisioningChangedCallback(mCallback);
+ mProvisioningManager.unregisterRcsProvisioningCallback(mCallback);
setClickable(mRegisterButton, false);
setClickable(mRegisterButton, true);
mIsRegistered = false;
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
index 10f588c..bbecbc2 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/UceActivity.java
@@ -19,6 +19,7 @@
import android.net.Uri;
import android.os.Bundle;
import android.telephony.SmsManager;
+import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsManager;
import android.telephony.ims.ImsRcsManager;
@@ -26,6 +27,7 @@
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.RcsUceAdapter;
import android.text.TextUtils;
+import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.MenuItem;
import android.widget.Button;
@@ -47,7 +49,6 @@
private Button mCapabilityButton;
private Button mAvailabilityButton;
private TextView mCapabilityResult;
- private TextView mAvailabilityResult;
private EditText mNumbers;
private int mDefaultSmsSubId;
private ImsRcsManager mImsRcsManager;
@@ -63,15 +64,25 @@
initLayout();
}
- private void initLayout() {
+ @Override
+ protected void onStart() {
+ super.onStart();
mDefaultSmsSubId = SmsManager.getDefaultSmsSubscriptionId();
+ Log.i(TAG, "defaultSmsSubId:" + mDefaultSmsSubId);
+ if (SubscriptionManager.isValidSubscriptionId(mDefaultSmsSubId)) {
+ mImsRcsManager = getImsRcsManager(mDefaultSmsSubId);
+ if (mImsRcsManager != null) {
+ initLayout();
+ }
+ }
+ }
+ private void initLayout() {
mCapabilityButton = findViewById(R.id.capability_btn);
mAvailabilityButton = findViewById(R.id.availability_btn);
mCapabilityResult = findViewById(R.id.capability_result);
- mAvailabilityResult = findViewById(R.id.capability_result);
+ mCapabilityResult.setMovementMethod(new ScrollingMovementMethod());
- mImsRcsManager = getImsRcsManager(mDefaultSmsSubId);
mCapabilityButton.setOnClickListener(view -> {
List<Uri> contactList = getContectList();
if (contactList.size() == 0) {
@@ -84,13 +95,13 @@
new RcsUceAdapter.CapabilitiesCallback() {
public void onCapabilitiesReceived(
List<RcsContactUceCapability> contactCapabilities) {
- Log.i(TAG, "onCapabilitiesReceived()");
StringBuilder b = new StringBuilder("onCapabilitiesReceived:\n");
for (RcsContactUceCapability c : contactCapabilities) {
b.append(getReadableCapability(c));
b.append("\n");
}
mCapabilityResult.append(b.toString() + "\n");
+ Log.i(TAG, b.toString());
}
public void onComplete() {
@@ -100,10 +111,11 @@
}
public void onError(int errorCode, long retryAfterMilliseconds) {
- Log.i(TAG, "onError() errorCode:" + errorCode + " retryAfterMs:"
- + retryAfterMilliseconds);
- mCapabilityResult.append("error - errorCode:" + errorCode
- + " retryAfterMs:" + retryAfterMilliseconds);
+ String result =
+ "onError() errorCode:" + errorCode + " retryAfterMs:"
+ + retryAfterMilliseconds + "\n";
+ Log.i(TAG, result);
+ mCapabilityResult.append(result);
}
});
} catch (ImsException e) {
@@ -117,36 +129,37 @@
Log.i(TAG, "empty contact list");
return;
}
- mAvailabilityResult.setText("pending...\n");
+ mCapabilityResult.setText("pending...\n");
try {
mImsRcsManager.getUceAdapter().requestAvailability(contactList.get(0),
getMainExecutor(), new RcsUceAdapter.CapabilitiesCallback() {
public void onCapabilitiesReceived(
List<RcsContactUceCapability> contactCapabilities) {
- Log.i(TAG, "onCapabilitiesReceived()");
StringBuilder b = new StringBuilder("onCapabilitiesReceived:\n");
for (RcsContactUceCapability c : contactCapabilities) {
b.append(getReadableCapability(c));
b.append("\n");
}
- mAvailabilityResult.append(b.toString() + "\n");
+ mCapabilityResult.append(b.toString() + "\n");
+ Log.i(TAG, b.toString());
}
public void onComplete() {
Log.i(TAG, "onComplete()");
- mAvailabilityResult.append("complete");
+ mCapabilityResult.append("complete");
}
public void onError(int errorCode, long retryAfterMilliseconds) {
- Log.i(TAG, "onError() errorCode:" + errorCode + " retryAfterMs:"
- + retryAfterMilliseconds);
- mAvailabilityResult.append("error - errorCode:" + errorCode
- + " retryAfterMs:" + retryAfterMilliseconds);
+ String result =
+ "onError() errorCode:" + errorCode + " retryAfterMs:"
+ + retryAfterMilliseconds + "\n";
+ Log.i(TAG, result);
+ mCapabilityResult.append(result);
}
});
} catch (ImsException e) {
- mAvailabilityResult.setText("ImsException:" + e);
+ mCapabilityResult.setText("ImsException:" + e);
}
});
}
diff --git a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
index 0447d1a..4489349 100644
--- a/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
+++ b/testapps/TestRcsApp/TestApp/src/com/google/android/sample/rcsclient/util/ChatManager.java
@@ -79,8 +79,8 @@
mSimpleRcsClient = SimpleRcsClient.newBuilder()
.registrationController(mRegistrationController)
.provisioningController(mProvisioningController)
- .imsService(mImsService)
- .executor(mFixedThreadPool).build();
+ .imsService(mImsService).build();
+
mState = State.NEW;
// register callback for state change
mSimpleRcsClient.onStateChanged((oldState, newState) -> {
@@ -183,6 +183,8 @@
URI uri = createUri(telUriContact);
if (mContactSessionMap.containsKey(uri)) {
callback.onSuccess();
+ Log.i(TAG, "uri exists");
+ return;
}
Futures.addCallback(
mImsService.startOriginatingChatSession(telUriContact),
@@ -223,10 +225,6 @@
* @param message chat message.
*/
public void sendMessage(String telUriContact, String message) {
- if (mState != State.REGISTERED) {
- Log.i(TAG, "Could not send msg due to State = " + mState);
- return;
- }
SimpleChatSession chatSession = mContactSessionMap.get(createUri(telUriContact));
if (chatSession == null) {
Log.i(TAG, "session is unavailable for telUriContact = " + telUriContact);
@@ -235,6 +233,26 @@
chatSession.sendMessage(message);
}
+ public boolean isRegistered() {
+ return (mState == State.REGISTERED);
+ }
+
+ /**
+ * Terminate the chat session.
+ * @param telUriContact destination tel Uri
+ */
+ public void terminateSession(String telUriContact) {
+ Log.i(TAG, "terminateSession");
+ URI uri = createUri(telUriContact);
+ SimpleChatSession chatSession = mContactSessionMap.get(uri);
+ if (chatSession == null) {
+ Log.i(TAG, "session is unavailable for telUriContact = " + telUriContact);
+ return;
+ }
+ chatSession.terminate();
+ mContactSessionMap.remove(uri);
+ }
+
/**
* Insert chat information into database.
* @param message chat message.
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/SimpleRcsClient.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/SimpleRcsClient.java
index c299cc9..0469bc0 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/SimpleRcsClient.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/SimpleRcsClient.java
@@ -24,14 +24,10 @@
import com.android.libraries.rcs.simpleclient.protocol.sip.SipSession;
import com.android.libraries.rcs.simpleclient.provisioning.ProvisioningController;
-import com.android.libraries.rcs.simpleclient.provisioning.StaticConfigProvisioningController;
import com.android.libraries.rcs.simpleclient.registration.RegistrationController;
+import com.android.libraries.rcs.simpleclient.registration.RegistrationStateChangeCallback;
import com.android.libraries.rcs.simpleclient.service.ImsService;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-
-import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicReference;
/**
@@ -46,7 +42,6 @@
private ProvisioningController provisioningController;
private RegistrationController registrationController;
private ImsService imsService;
- private Executor executor;
private SimpleRcsClientContext context;
private StateChangedCallback stateChangedCallback;
@@ -108,23 +103,31 @@
return;
}
- Futures.addCallback(registrationController.register(imsService),
- new FutureCallback<SipSession>() {
+ registrationController.register(imsService,
+ new RegistrationStateChangeCallback() {
@Override
- public void onSuccess(SipSession result) {
- Log.i(TAG, "onSuccess:" + result);
- registered(result);
+ public void notifyRegStateChanged(ImsService imsService) {
+
}
@Override
- public void onFailure(Throwable t) {
- Log.i(TAG, "onFailure:" + t);
+ public void onSuccess(SipSession sipSession) {
+ Log.i(TAG, "onSuccess");
+ registered(sipSession);
}
- }, executor);
+
+ @Override
+ public void onFailure(String reason) {
+ Log.i(TAG, "onFailure reason:" + reason);
+ notRegistered();
+ }
+ });
}
private void registered(SipSession session) {
- enterState(State.REGISTERING, State.REGISTERED);
+ if (state.get().equals(State.REGISTERING) || state.get().equals(State.NOT_REGISTERED)) {
+ enterState(state.get(), State.REGISTERED);
+ }
context = new SimpleRcsClientContext(provisioningController, registrationController,
imsService,
@@ -133,6 +136,10 @@
imsService.start(context);
}
+ private void notRegistered() {
+ enterState(State.REGISTERED, State.NOT_REGISTERED);
+ }
+
/**
* Possible client states.
*/
@@ -141,6 +148,7 @@
PROVISIONING,
REGISTERING,
REGISTERED,
+ NOT_REGISTERED,
}
/**
@@ -151,7 +159,6 @@
private ProvisioningController provisioningController;
private RegistrationController registrationController;
private ImsService imsService;
- private Executor executor;
public Builder provisioningController(ProvisioningController controller) {
this.provisioningController = controller;
@@ -168,17 +175,11 @@
return this;
}
- public Builder executor(Executor executor) {
- this.executor = executor;
- return this;
- }
-
public SimpleRcsClient build() {
SimpleRcsClient client = new SimpleRcsClient();
client.registrationController = registrationController;
client.provisioningController = provisioningController;
client.imsService = imsService;
- client.executor = executor;
return client;
}
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java
index 350f43c..83f41d4 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/provisioning/StaticConfigProvisioningController.java
@@ -24,15 +24,15 @@
import android.telephony.ims.RcsClientConfiguration;
import android.util.Log;
-import java.util.Optional;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import androidx.annotation.VisibleForTesting;
+import java.util.Optional;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
/**
* "Fake" provisioning implementation for supplying a static config when testing ProvisioningManager
* is unnecessary. State changes are invoked manually.
@@ -136,7 +136,7 @@
Log.i(TAG, "Registering the callback.");
synchronized (this) {
- provisioningManager.registerRcsProvisioningChangedCallback(executorService, callback);
+ provisioningManager.registerRcsProvisioningCallback(executorService, callback);
storedCallback = Optional.of(callback);
}
}
@@ -147,7 +147,7 @@
RcsProvisioningCallback callback =
storedCallback.orElseThrow(
() -> new IllegalStateException("No callback present."));
- provisioningManager.unregisterRcsProvisioningChangedCallback(callback);
+ provisioningManager.unregisterRcsProvisioningCallback(callback);
storedCallback = Optional.empty();
}
}
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationController.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationController.java
index 64d93b2..8bbe327 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationController.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationController.java
@@ -16,21 +16,18 @@
package com.android.libraries.rcs.simpleclient.registration;
-import com.android.libraries.rcs.simpleclient.protocol.sip.SipSession;
import com.android.libraries.rcs.simpleclient.service.ImsService;
-import com.google.common.util.concurrent.ListenableFuture;
-
/**
* Access to registration functionality.
*/
public interface RegistrationController {
/**
- * Registers the given ImsService with the backend and returns a SipSession for sending and
- * receiving SIP messages.
+ * Register the given ImsService with the backend and use the callback to return a SipSession
+ * for sending and receiving SIP messages.
*/
- ListenableFuture<SipSession> register(ImsService imsService);
+ void register(ImsService imsService, RegistrationStateChangeCallback callback);
void deregister();
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationControllerImpl.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationControllerImpl.java
index f1868fc..9ababc3 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationControllerImpl.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationControllerImpl.java
@@ -68,6 +68,7 @@
private final int subscriptionId;
private SipDelegateManager sipDelegateManager;
private RegistrationContext context;
+ private RegistrationStateChangeCallback callback;
public RegistrationControllerImpl(int subscriptionId, Executor executor,
ImsManager imsManager) {
@@ -77,11 +78,11 @@
}
@Override
- public ListenableFuture<SipSession> register(ImsService imsService) {
+ public void register(ImsService imsService, RegistrationStateChangeCallback callback) {
Log.i(TAG, "register");
+ this.callback = callback;
context = new RegistrationContext(this, imsService);
context.register();
- return context.getFuture();
}
@Override
@@ -101,7 +102,7 @@
/**
* Envelopes the registration data for a single ImsService instance.
*/
- private static class RegistrationContext implements SipSession, SipSessionConfiguration {
+ private class RegistrationContext implements SipSession, SipSessionConfiguration {
private final RegistrationControllerImpl controller;
private final ImsService imsService;
@@ -139,12 +140,17 @@
.getRegisteredFeatureTags()
.containsAll(imsService.getFeatureTags())) {
// registered;
- sessionFuture.set(RegistrationContext.this);
+ callback.onSuccess(RegistrationContext.this);
+ } else {
+ callback.onFailure("feature tag not registered");
}
}
@Override
public void onDestroyed(int reason) {
+ Log.d(TAG, "onDestroyed:" + reason);
+ callback.onFailure("delegate destroyed");
+
}
};
private SipSessionListener sipSessionListener;
@@ -167,10 +173,13 @@
@Override
public void onMessageSendFailure(@NonNull String viaTransactionId, int reason) {
+ Log.i(TAG, "onMessageSendFailure: viaTransactionId:"
+ + viaTransactionId + ", reason:" + reason);
}
@Override
public void onMessageSent(@NonNull String viaTransactionId) {
+ Log.i(TAG, "onMessageSent: viaTransactionId:" + viaTransactionId);
}
};
@@ -435,7 +444,7 @@
* for now.
* @return A SipMessage with the corrected header section.
*/
- private static SipMessage repairHeaderSection(SipMessage message) {
+ private SipMessage repairHeaderSection(SipMessage message) {
String headers = message.getHeaderSection();
if (headers.startsWith("ia:")) {
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationStateChangeCallback.java b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationStateChangeCallback.java
index 4f36ce5..570b313 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationStateChangeCallback.java
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/src/com/android/libraries/rcs/simpleclient/registration/RegistrationStateChangeCallback.java
@@ -16,6 +16,7 @@
package com.android.libraries.rcs.simpleclient.registration;
+import com.android.libraries.rcs.simpleclient.protocol.sip.SipSession;
import com.android.libraries.rcs.simpleclient.service.ImsService;
/**
@@ -30,4 +31,10 @@
* @param imsService the newly registered service.
*/
void notifyRegStateChanged(ImsService imsService);
+
+ /**callback for successful session creation */
+ void onSuccess(SipSession sipSession);
+
+ /**callback for failed session creation. */
+ void onFailure(String reason);
}
diff --git a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
index f77dd55..28c4390 100644
--- a/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
+++ b/tests/src/com/android/phone/RcsProvisioningMonitorTest.java
@@ -475,13 +475,13 @@
public void testRegisterThenUnregisterCallback() throws Exception {
createMonitor(1);
- boolean result = mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+ boolean result = mRcsProvisioningMonitor.registerRcsProvisioningCallback(
FAKE_SUB_ID_BASE, mCallback);
assertTrue(result);
verify(mIImsConfig, times(1)).addRcsConfigCallback(eq(mCallback));
- result = mRcsProvisioningMonitor.unregisterRcsProvisioningChangedCallback(
+ result = mRcsProvisioningMonitor.unregisterRcsProvisioningCallback(
FAKE_SUB_ID_BASE, mCallback);
assertTrue(result);
@@ -494,7 +494,7 @@
public void testCallbackRemovedWhenSubInfoChanged() throws Exception {
createMonitor(1);
- boolean result = mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+ boolean result = mRcsProvisioningMonitor.registerRcsProvisioningCallback(
FAKE_SUB_ID_BASE, mCallback);
makeFakeActiveSubIds(0);
mExecutor.execute(() -> mSubChangedListener.onSubscriptionsChanged());
@@ -510,7 +510,7 @@
public void testCallbackRemovedWhenDmaChanged() throws Exception {
createMonitor(1);
- boolean result = mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+ boolean result = mRcsProvisioningMonitor.registerRcsProvisioningCallback(
FAKE_SUB_ID_BASE, mCallback);
updateDefaultMessageApplication(DEFAULT_MESSAGING_APP2);
processAllMessages();
@@ -524,7 +524,7 @@
@SmallTest
public void testRcsConnectedAndDisconnected() throws Exception {
createMonitor(1);
- mRcsProvisioningMonitor.registerRcsProvisioningChangedCallback(
+ mRcsProvisioningMonitor.registerRcsProvisioningCallback(
FAKE_SUB_ID_BASE, mCallback);
verify(mIImsConfig, times(1))