diff options
Diffstat (limited to 'java/com/android/dialer/callcomposer')
10 files changed, 137 insertions, 109 deletions
diff --git a/java/com/android/dialer/callcomposer/CallComposerActivity.java b/java/com/android/dialer/callcomposer/CallComposerActivity.java index 9fb6c38f4..3c0beb101 100644 --- a/java/com/android/dialer/callcomposer/CallComposerActivity.java +++ b/java/com/android/dialer/callcomposer/CallComposerActivity.java @@ -41,13 +41,13 @@ import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.ViewAnimationUtils; import android.view.ViewGroup; +import android.view.WindowManager.LayoutParams; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.QuickContactBadge; import android.widget.RelativeLayout; import android.widget.TextView; -import android.widget.Toolbar; import com.android.contacts.common.ContactPhotoManager; import com.android.dialer.callcomposer.CallComposerFragment.CallComposerListener; import com.android.dialer.callcomposer.nano.CallComposerContact; @@ -70,6 +70,7 @@ import com.android.dialer.multimedia.MultimediaData; import com.android.dialer.protos.ProtoParsers; import com.android.dialer.telecom.TelecomUtil; import com.android.dialer.util.ViewUtil; +import com.android.dialer.widget.DialerToolbar; import com.google.protobuf.nano.InvalidProtocolBufferNanoException; import java.io.File; @@ -110,7 +111,7 @@ public class CallComposerActivity extends AppCompatActivity private TextView numberView; private QuickContactBadge contactPhoto; private RelativeLayout contactContainer; - private Toolbar toolbar; + private DialerToolbar toolbar; private View sendAndCall; private TextView sendAndCallText; @@ -151,7 +152,7 @@ public class CallComposerActivity extends AppCompatActivity pager = (ViewPager) findViewById(R.id.call_composer_view_pager); background = (FrameLayout) findViewById(R.id.background); windowContainer = (LinearLayout) findViewById(R.id.call_composer_container); - toolbar = (Toolbar) findViewById(R.id.toolbar); + toolbar = (DialerToolbar) findViewById(R.id.toolbar); sendAndCall = findViewById(R.id.send_and_call_button); sendAndCallText = (TextView) findViewById(R.id.send_and_call_text); @@ -163,10 +164,6 @@ public class CallComposerActivity extends AppCompatActivity pager.setAdapter(adapter); pager.addOnPageChangeListener(this); - setActionBar(toolbar); - toolbar.setNavigationIcon(R.drawable.quantum_ic_close_white_24); - toolbar.setNavigationOnClickListener(v -> finish()); - background.addOnLayoutChangeListener(this); cameraIcon.setOnClickListener(this); galleryIcon.setOnClickListener(this); @@ -183,6 +180,11 @@ public class CallComposerActivity extends AppCompatActivity onPageSelected(currentIndex); } + int adjustMode = + isLandscapeLayout() + ? LayoutParams.SOFT_INPUT_ADJUST_PAN + : LayoutParams.SOFT_INPUT_ADJUST_RESIZE; + getWindow().setSoftInputMode(adjustMode); // Since we can't animate the views until they are ready to be drawn, we use this listener to // track that and animate the call compose UI as soon as it's ready. ViewUtil.doOnPreDraw( @@ -262,79 +264,83 @@ public class CallComposerActivity extends AppCompatActivity } else if (view == messageIcon) { pager.setCurrentItem(CallComposerPagerAdapter.INDEX_MESSAGE, true /* animate */); } else if (view == sendAndCall) { - if (!sessionReady()) { - LogUtil.i( - "CallComposerActivity.onClick", "sendAndCall pressed, but the session isn't ready"); - Logger.get(this) - .logImpression( - DialerImpression.Type - .CALL_COMPOSER_ACTIVITY_SEND_AND_CALL_PRESSED_WHEN_SESSION_NOT_READY); - return; - } - sendAndCall.setEnabled(false); - CallComposerFragment fragment = - (CallComposerFragment) adapter.instantiateItem(pager, currentIndex); - MultimediaData.Builder builder = MultimediaData.builder(); - - if (fragment instanceof MessageComposerFragment) { - MessageComposerFragment messageComposerFragment = (MessageComposerFragment) fragment; - builder.setText(messageComposerFragment.getMessage()); - placeRCSCall(builder); - } - if (fragment instanceof GalleryComposerFragment) { - GalleryComposerFragment galleryComposerFragment = (GalleryComposerFragment) fragment; - // If the current data is not a copy, make one. - if (!galleryComposerFragment.selectedDataIsCopy()) { - new CopyAndResizeImageTask( - CallComposerActivity.this, - galleryComposerFragment.getGalleryData().getFileUri(), - new Callback() { - @Override - public void onCopySuccessful(File file, String mimeType) { - Uri shareableUri = - FileProvider.getUriForFile( - CallComposerActivity.this, - Constants.get().getFileProviderAuthority(), - file); - - builder.setImage(grantUriPermission(shareableUri), mimeType); - placeRCSCall(builder); - } - - @Override - public void onCopyFailed(Throwable throwable) { - // TODO(b/34279096) - gracefully handle message failure - LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable); - } - }) - .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } else { - Uri shareableUri = - FileProvider.getUriForFile( - this, - Constants.get().getFileProviderAuthority(), - new File(galleryComposerFragment.getGalleryData().getFilePath())); - - builder.setImage( - grantUriPermission(shareableUri), - galleryComposerFragment.getGalleryData().getMimeType()); - - placeRCSCall(builder); - } - } - if (fragment instanceof CameraComposerFragment) { - CameraComposerFragment cameraComposerFragment = (CameraComposerFragment) fragment; - cameraComposerFragment.getCameraUriWhenReady( - uri -> { - builder.setImage(grantUriPermission(uri), cameraComposerFragment.getMimeType()); - placeRCSCall(builder); - }); - } + sendAndCall(); } else { Assert.fail(); } } + @Override + public void sendAndCall() { + if (!sessionReady()) { + LogUtil.i("CallComposerActivity.onClick", "sendAndCall pressed, but the session isn't ready"); + Logger.get(this) + .logImpression( + DialerImpression.Type + .CALL_COMPOSER_ACTIVITY_SEND_AND_CALL_PRESSED_WHEN_SESSION_NOT_READY); + return; + } + sendAndCall.setEnabled(false); + CallComposerFragment fragment = + (CallComposerFragment) adapter.instantiateItem(pager, currentIndex); + MultimediaData.Builder builder = MultimediaData.builder(); + + if (fragment instanceof MessageComposerFragment) { + MessageComposerFragment messageComposerFragment = (MessageComposerFragment) fragment; + builder.setText(messageComposerFragment.getMessage()); + placeRCSCall(builder); + } + if (fragment instanceof GalleryComposerFragment) { + GalleryComposerFragment galleryComposerFragment = (GalleryComposerFragment) fragment; + // If the current data is not a copy, make one. + if (!galleryComposerFragment.selectedDataIsCopy()) { + new CopyAndResizeImageTask( + CallComposerActivity.this, + galleryComposerFragment.getGalleryData().getFileUri(), + new Callback() { + @Override + public void onCopySuccessful(File file, String mimeType) { + Uri shareableUri = + FileProvider.getUriForFile( + CallComposerActivity.this, + Constants.get().getFileProviderAuthority(), + file); + + builder.setImage(grantUriPermission(shareableUri), mimeType); + placeRCSCall(builder); + } + + @Override + public void onCopyFailed(Throwable throwable) { + // TODO(b/34279096) - gracefully handle message failure + LogUtil.e("CallComposerActivity.onCopyFailed", "copy Failed", throwable); + } + }) + .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + } else { + Uri shareableUri = + FileProvider.getUriForFile( + this, + Constants.get().getFileProviderAuthority(), + new File(galleryComposerFragment.getGalleryData().getFilePath())); + + builder.setImage( + grantUriPermission(shareableUri), + galleryComposerFragment.getGalleryData().getMimeType()); + + placeRCSCall(builder); + } + } + if (fragment instanceof CameraComposerFragment) { + CameraComposerFragment cameraComposerFragment = (CameraComposerFragment) fragment; + cameraComposerFragment.getCameraUriWhenReady( + uri -> { + builder.setImage(grantUriPermission(uri), cameraComposerFragment.getMimeType()); + placeRCSCall(builder); + }); + } + } + private boolean sessionReady() { Session session = getEnrichedCallManager().getSession(sessionId); if (session == null) { @@ -482,7 +488,7 @@ public class CallComposerActivity extends AppCompatActivity contact.contactType); nameView.setText(contact.nameOrNumber); - getActionBar().setTitle(contact.nameOrNumber); + toolbar.setTitle(contact.nameOrNumber); if (!TextUtils.isEmpty(contact.numberLabel) && !TextUtils.isEmpty(contact.displayNumber)) { numberView.setVisibility(View.VISIBLE); String secondaryInfo = @@ -577,11 +583,11 @@ public class CallComposerActivity extends AppCompatActivity inFullscreenMode = fullscreen; ViewGroup.LayoutParams layoutParams = pager.getLayoutParams(); if (isLandscapeLayout()) { - layoutParams.height = background.getHeight() - messageIcon.getHeight(); + layoutParams.height = background.getHeight(); toolbar.setVisibility(View.INVISIBLE); contactContainer.setVisibility(View.GONE); } else if (fullscreen || getResources().getBoolean(R.bool.show_toolbar)) { - layoutParams.height = background.getHeight() - toolbar.getHeight() - messageIcon.getHeight(); + layoutParams.height = background.getHeight() - toolbar.getHeight(); toolbar.setVisibility(View.VISIBLE); contactContainer.setVisibility(View.GONE); } else { diff --git a/java/com/android/dialer/callcomposer/CallComposerFragment.java b/java/com/android/dialer/callcomposer/CallComposerFragment.java index ee1eb462a..b60657189 100644 --- a/java/com/android/dialer/callcomposer/CallComposerFragment.java +++ b/java/com/android/dialer/callcomposer/CallComposerFragment.java @@ -62,5 +62,8 @@ public abstract class CallComposerFragment extends Fragment { /** True if the layout is in landscape mode. */ boolean isLandscapeLayout(); + + /** Tell the listener that call composition is done and we should start the call. */ + void sendAndCall(); } } diff --git a/java/com/android/dialer/callcomposer/CameraComposerFragment.java b/java/com/android/dialer/callcomposer/CameraComposerFragment.java index 01f7f6087..ceefc068e 100644 --- a/java/com/android/dialer/callcomposer/CameraComposerFragment.java +++ b/java/com/android/dialer/callcomposer/CameraComposerFragment.java @@ -331,6 +331,7 @@ public class CameraComposerFragment extends CallComposerFragment if (cameraUri != null) { previewImageView.setImageURI(cameraUri); previewImageView.setVisibility(View.VISIBLE); + previewImageView.setScaleX(cameraDirection == CameraInfo.CAMERA_FACING_FRONT ? -1 : 1); } else { previewImageView.setVisibility(View.GONE); } diff --git a/java/com/android/dialer/callcomposer/MessageComposerFragment.java b/java/com/android/dialer/callcomposer/MessageComposerFragment.java index d8100033f..2a342bb08 100644 --- a/java/com/android/dialer/callcomposer/MessageComposerFragment.java +++ b/java/com/android/dialer/callcomposer/MessageComposerFragment.java @@ -22,6 +22,7 @@ import android.text.Editable; import android.text.InputFilter; import android.text.TextUtils; import android.text.TextWatcher; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -31,10 +32,15 @@ import android.view.View.OnTouchListener; import android.view.ViewGroup; import android.widget.EditText; import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; /** Fragment used to compose call with message fragment. */ public class MessageComposerFragment extends CallComposerFragment - implements OnClickListener, TextWatcher, OnTouchListener, OnLongClickListener { + implements OnClickListener, + TextWatcher, + OnTouchListener, + OnLongClickListener, + OnEditorActionListener { private static final String CHAR_LIMIT_KEY = "char_limit"; public static final int NO_CHAR_LIMIT = -1; @@ -70,6 +76,7 @@ public class MessageComposerFragment extends CallComposerFragment customMessage.setOnTouchListener(this); customMessage.setOnLongClickListener(this); customMessage.addTextChangedListener(this); + customMessage.setOnEditorActionListener(this); if (charLimit != NO_CHAR_LIMIT) { TextView remainingChar = (TextView) view.findViewById(R.id.remaining_characters); remainingChar.setText("" + charLimit); @@ -144,4 +151,13 @@ public class MessageComposerFragment extends CallComposerFragment public void clearComposer() { customMessage.getText().clear(); } + + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (getMessage() == null) { + return false; + } + getListener().sendAndCall(); + return true; + } } diff --git a/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml b/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml index f687f0b5c..c3f1102d1 100644 --- a/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml +++ b/java/com/android/dialer/callcomposer/res/layout/call_composer_activity.xml @@ -74,12 +74,14 @@ android:id="@+id/call_composer_view_pager" android:layout_width="match_parent" android:layout_height="@dimen/call_composer_view_pager_height"/> + </LinearLayout> - <FrameLayout + <FrameLayout android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:layout_gravity="bottom"> - <LinearLayout + <LinearLayout android:id="@+id/media_actions" android:layout_width="match_parent" android:layout_height="@dimen/call_composer_media_bar_height" @@ -88,7 +90,7 @@ android:background="@color/dialer_secondary_color" android:clickable="true"> - <ImageView + <ImageView android:id="@+id/call_composer_camera" android:layout_width="@dimen/call_composer_media_actions_width" android:layout_height="match_parent" @@ -96,7 +98,7 @@ android:src="@drawable/quantum_ic_camera_alt_white_24" android:background="?android:attr/selectableItemBackgroundBorderless"/> - <ImageView + <ImageView android:id="@+id/call_composer_photo" android:layout_width="@dimen/call_composer_media_actions_width" android:layout_height="match_parent" @@ -104,22 +106,22 @@ android:src="@drawable/quantum_ic_photo_white_24" android:background="?android:attr/selectableItemBackgroundBorderless"/> - <ImageView + <ImageView android:id="@+id/call_composer_message" android:layout_width="@dimen/call_composer_media_actions_width" android:layout_height="match_parent" android:scaleType="center" - android:src="@drawable/ic_message_24dp" + android:src="@drawable/quantum_ic_message_white_24" android:background="?android:attr/selectableItemBackgroundBorderless"/> - </LinearLayout> + </LinearLayout> - <FrameLayout + <FrameLayout android:id="@+id/send_and_call_button" android:layout_width="match_parent" android:layout_height="@dimen/call_composer_media_bar_height" android:visibility="invisible" android:background="@color/compose_and_call_background"> - <TextView + <TextView android:id="@+id/send_and_call_text" android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -131,18 +133,11 @@ android:textSize="@dimen/send_and_call_text_size" android:fontFamily="sans-serif-medium" android:textColor="@color/background_dialer_white"/> - </FrameLayout> </FrameLayout> - </LinearLayout> + </FrameLayout> - <Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="?attr/actionBarSize" - android:visibility="invisible" - android:titleTextAppearance="@style/toolbar_title_text" - android:subtitleTextAppearance="@style/toolbar_subtitle_text" - android:navigationIcon="@drawable/quantum_ic_close_white_24" - android:background="@color/dialer_theme_color"/> -</FrameLayout>
\ No newline at end of file + <com.android.dialer.widget.DialerToolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> +</FrameLayout> diff --git a/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml b/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml index 200a3dce7..f1db48e5b 100644 --- a/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml +++ b/java/com/android/dialer/callcomposer/res/layout/fragment_camera_composer.xml @@ -17,7 +17,8 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" - android:layout_width="match_parent"> + android:layout_width="match_parent" + android:paddingBottom="@dimen/call_composer_media_bar_height"> <include android:layout_width="match_parent" diff --git a/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml b/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml index a4bd4df03..6cd6418a4 100644 --- a/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml +++ b/java/com/android/dialer/callcomposer/res/layout/fragment_gallery_composer.xml @@ -18,7 +18,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/background_dialer_white"> + android:background="@color/background_dialer_white" + android:paddingBottom="@dimen/call_composer_media_bar_height"> <GridView android:id="@+id/gallery_grid_view" diff --git a/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml b/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml index 577887be9..77c7a58d1 100644 --- a/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml +++ b/java/com/android/dialer/callcomposer/res/layout/fragment_message_composer.xml @@ -59,7 +59,10 @@ android:id="@+id/custom_message" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="@dimen/message_composer_item_padding" + android:paddingTop="@dimen/message_composer_item_padding" + android:paddingStart="@dimen/message_composer_item_padding" + android:paddingEnd="@dimen/message_composer_item_padding" + android:paddingBottom="64dp" android:textSize="@dimen/message_compose_item_text_size" android:hint="@string/message_composer_custom_message_hint" android:textColor="@color/dialer_primary_text_color" @@ -67,13 +70,15 @@ android:background="@color/background_dialer_white" android:textCursorDrawable="@drawable/searchedittext_custom_cursor" android:layout_toStartOf="@+id/remaining_characters" - android:imeOptions="flagNoExtractUi"/> + android:inputType="textShortMessage" + android:imeOptions="flagNoExtractUi|actionSend"/> <TextView android:id="@+id/remaining_characters" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="@dimen/message_composer_item_padding" + android:paddingBottom="@dimen/call_composer_media_bar_height" android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:textSize="@dimen/message_compose_remaining_char_text_size" diff --git a/java/com/android/dialer/callcomposer/res/values/dimens.xml b/java/com/android/dialer/callcomposer/res/values/dimens.xml index 5571170b2..d55540077 100644 --- a/java/com/android/dialer/callcomposer/res/values/dimens.xml +++ b/java/com/android/dialer/callcomposer/res/values/dimens.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> <resources> - <dimen name="call_composer_view_pager_height">258dp</dimen> + <dimen name="call_composer_view_pager_height">306dp</dimen> <!-- Contact bar --> <dimen name="call_composer_contact_photo_border_thickness">2dp</dimen> diff --git a/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java b/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java index be08555f9..81511d274 100644 --- a/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java +++ b/java/com/android/dialer/callcomposer/util/CopyAndResizeImageTask.java @@ -36,7 +36,7 @@ import java.io.OutputStream; /** Task for copying and resizing images to be shared with RCS process. */ @TargetApi(VERSION_CODES.M) public class CopyAndResizeImageTask extends FallibleAsyncTask<Void, Void, File> { - public static final int MAX_OUTPUT_RESOLUTION = 1024; + public static final int MAX_OUTPUT_RESOLUTION = 640; private static final String MIME_TYPE = "image/jpeg"; private final Context context; @@ -59,7 +59,7 @@ public class CopyAndResizeImageTask extends FallibleAsyncTask<Void, Void, File> File outputFile = DialerUtils.createShareableFile(context); try (OutputStream outputStream = new FileOutputStream(outputFile)) { // Encode images to jpeg as it is better for camera pictures which we expect to be sending - bitmap.compress(CompressFormat.JPEG, 90, outputStream); + bitmap.compress(CompressFormat.JPEG, 80, outputStream); return outputFile; } } |