enable pip support for CallNotificationActivity

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2021-10-28 13:02:18 +02:00
parent 7e68ecbde9
commit e05334cb9a
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
4 changed files with 95 additions and 41 deletions

View File

@ -134,6 +134,7 @@
<activity <activity
android:name=".activities.CallNotificationActivity" android:name=".activities.CallNotificationActivity"
android:theme="@style/AppTheme.CallLauncher" android:theme="@style/AppTheme.CallLauncher"
android:supportsPictureInPicture="true"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:launchMode="singleTask" android:launchMode="singleTask"
android:taskAffinity=".call" android:taskAffinity=".call"

View File

@ -2340,33 +2340,6 @@ public class CallActivity extends BaseActivity {
} }
} }
public void updateUiForPipMode(){
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0,0,0, 0);
binding.gridview.setLayoutParams(params);
binding.callControls.setVisibility(View.GONE);
binding.callInfosLinearLayout.setVisibility(View.GONE);
binding.selfVideoViewWrapper.setVisibility(View.GONE);
binding.callStates.callStateRelativeLayout.setVisibility(View.GONE);
binding.selfVideoRenderer.release();
}
public void updateUiForNormalMode(){
if (isVoiceOnlyCall) {
binding.callControls.setVisibility(View.VISIBLE);
} else {
binding.callControls.setVisibility(View.INVISIBLE); // animateCallControls needs this to be invisible for a check.
}
initViews();
binding.callInfosLinearLayout.setVisibility(View.VISIBLE);
binding.selfVideoViewWrapper.setVisibility(View.VISIBLE);
}
private String getDescriptionForCallType() { private String getDescriptionForCallType() {
String appName = getResources().getString(R.string.nc_app_product_name); String appName = getResources().getString(R.string.nc_app_product_name);
if (isVoiceOnlyCall) { if (isVoiceOnlyCall) {
@ -2474,6 +2447,44 @@ public class CallActivity extends BaseActivity {
.build(); .build();
} }
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
isInPipMode = isInPictureInPictureMode;
if (isInPictureInPictureMode) {
updateUiForPipMode();
} else {
updateUiForNormalMode();
}
}
public void updateUiForPipMode(){
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0,0,0, 0);
binding.gridview.setLayoutParams(params);
binding.callControls.setVisibility(View.GONE);
binding.callInfosLinearLayout.setVisibility(View.GONE);
binding.selfVideoViewWrapper.setVisibility(View.GONE);
binding.callStates.callStateRelativeLayout.setVisibility(View.GONE);
binding.selfVideoRenderer.release();
}
public void updateUiForNormalMode(){
if (isVoiceOnlyCall) {
binding.callControls.setVisibility(View.VISIBLE);
} else {
binding.callControls.setVisibility(View.INVISIBLE); // animateCallControls needs this to be invisible for a check.
}
initViews();
binding.callInfosLinearLayout.setVisibility(View.VISIBLE);
binding.selfVideoViewWrapper.setVisibility(View.VISIBLE);
}
public void onConfigurationChanged(Configuration newConfig) { public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig); super.onConfigurationChanged(newConfig);
eventBus.post(new ConfigurationChangeEvent()); eventBus.post(new ConfigurationChangeEvent());
@ -2502,18 +2513,6 @@ public class CallActivity extends BaseActivity {
} }
} }
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
isInPipMode = isInPictureInPictureMode;
if (isInPictureInPictureMode) {
updateUiForPipMode();
} else {
updateUiForNormalMode();
}
}
private class SelfVideoTouchListener implements View.OnTouchListener { private class SelfVideoTouchListener implements View.OnTouchListener {
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")

View File

@ -21,8 +21,10 @@
package com.nextcloud.talk.activities; package com.nextcloud.talk.activities;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.PictureInPictureParams;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
@ -30,10 +32,12 @@ import android.graphics.drawable.ColorDrawable;
import android.media.AudioAttributes; import android.media.AudioAttributes;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.util.Rational;
import android.view.View; import android.view.View;
import com.bluelinelabs.logansquare.LoganSquare; import com.bluelinelabs.logansquare.LoganSquare;
@ -79,6 +83,7 @@ import java.util.List;
import javax.inject.Inject; import javax.inject.Inject;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import autodagger.AutoInjector; import autodagger.AutoInjector;
import butterknife.OnClick; import butterknife.OnClick;
@ -118,6 +123,7 @@ public class CallNotificationActivity extends BaseActivity {
private boolean leavingScreen = false; private boolean leavingScreen = false;
private Handler handler; private Handler handler;
private CallNotificationActivityBinding binding; private CallNotificationActivityBinding binding;
private Boolean isInPipMode = false;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@ -357,7 +363,7 @@ public class CallNotificationActivity extends BaseActivity {
binding.avatarImageView.getHierarchy().setImage(new BitmapDrawable(bitmap), 100, binding.avatarImageView.getHierarchy().setImage(new BitmapDrawable(bitmap), 100,
true); true);
if (getResources() != null) { if (getResources() != null) {
binding.incomingTextRelativeLayout.setBackground( binding.incomingCallRelativeLayout.setBackground(
getResources().getDrawable(R.drawable.incoming_gradient)); getResources().getDrawable(R.drawable.incoming_gradient));
} }
@ -473,4 +479,51 @@ public class CallNotificationActivity extends BaseActivity {
} }
} }
} }
public void onBackPressed() {
enterPipMode();
}
public void onUserLeaveHint() {
enterPipMode();
}
void enterPipMode() {
// enableKeyguard();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
enterPictureInPictureMode(getPipParams());
} else {
finish();
}
}
@RequiresApi(Build.VERSION_CODES.O)
public PictureInPictureParams getPipParams() {
Rational pipRatio = new Rational(300, 500);
return new PictureInPictureParams.Builder()
.setAspectRatio(pipRatio)
.build();
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
isInPipMode = isInPictureInPictureMode;
if (isInPictureInPictureMode) {
updateUiForPipMode();
} else {
updateUiForNormalMode();
}
}
public void updateUiForPipMode(){
binding.callAnswerButtons.setVisibility(View.INVISIBLE);
binding.incomingCallRelativeLayout.setVisibility(View.INVISIBLE);
}
public void updateUiForNormalMode(){
binding.callAnswerButtons.setVisibility(View.VISIBLE);
binding.incomingCallRelativeLayout.setVisibility(View.VISIBLE);
}
} }

View File

@ -35,6 +35,7 @@
tools:srcCompat="@tools:sample/backgrounds/scenic" /> tools:srcCompat="@tools:sample/backgrounds/scenic" />
<LinearLayout <LinearLayout
android:id="@+id/callAnswerButtons"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
@ -75,7 +76,7 @@
</LinearLayout> </LinearLayout>
<RelativeLayout <RelativeLayout
android:id="@+id/incomingTextRelativeLayout" android:id="@+id/incomingCallRelativeLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">