Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13bd3087 authored by yueg's avatar yueg Committed by android-build-merger
Browse files

Merge changes If4e613b1,I40fd1e21 am: dd4c4e0b

am: 5db3b549

Change-Id: Ic053a69217c121752e014fe023b9b809afab17b4
parents c12c052c 5db3b549
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -19,7 +19,11 @@
    android:viewportWidth="24.0"
    android:viewportHeight="24.0"
    android:tint="?attr/colorControlNormal">
  <group
      android:pivotX="12"
      android:scaleX="-1">
    <path
        android:fillColor="@android:color/white"
        android:pathData="M10.09,15.59L11.5,17l5,-5 -5,-5 -1.41,1.41L12.67,11H3v2h9.67l-2.58,2.59zM19,3H5c-1.11,0 -2,0.9 -2,2v4h2V5h14v14H5v-4H3v4c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2z"/>
  </group>
</vector>
 No newline at end of file
+29 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2018 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
  -->
<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="vector"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:name="path"
        android:pathData="M 15 3 L 6 3 C 5.17 3 4.46 3.5 4.16 4.22 L 1.14 11.27 C 1.05 11.5 1 11.74 1 12 L 1 13.91 L 1.01 13.92 L 1 14 C 1 15.1 1.9 16 3 16 L 9.31 16 L 8.36 20.57 L 8.33 20.89 C 8.33 21.3 8.5 21.68 8.77 21.95 L 9.83 23 L 16.42 16.41 C 16.78 16.05 17 15.55 17 15 L 17 5 C 17 3.9 16.1 3 15 3 Z M 19 3 L 19 15 L 23 15 L 23 3 L 19 3 Z"
        android:fillColor="#757575"
        android:strokeWidth="1"/>
</vector>
+29 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2018 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
  -->
<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:name="vector"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:name="path"
        android:pathData="M 1 21 L 5 21 L 5 9 L 1 9 L 1 21 Z M 23 10 C 23 8.9 22.1 8 21 8 L 14.69 8 L 15.64 3.43 L 15.67 3.11 C 15.67 2.7 15.5 2.32 15.23 2.05 L 14.17 1 L 7.59 7.59 C 7.22 7.95 7 8.45 7 9 L 7 19 C 7 20.1 7.9 21 9 21 L 18 21 C 18.83 21 19.54 20.5 19.84 19.78 L 22.86 12.73 C 22.95 12.5 23 12.26 23 12 L 23 10.09 L 22.99 10.08 L 23 10 Z"
        android:fillColor="#757575"
        android:strokeWidth="1"/>
</vector>
+168 −28
Original line number Diff line number Diff line
@@ -16,7 +16,9 @@

package com.android.dialer.app.calllog;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.net.Uri;
@@ -25,11 +27,18 @@ import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.support.v4.content.ContextCompat;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.TextAppearanceSpan;
import android.text.style.URLSpan;
import android.text.util.Linkify;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.android.dialer.app.R;
@@ -41,7 +50,9 @@ import com.android.dialer.compat.telephony.TelephonyManagerCompat;
import com.android.dialer.logging.ContactSource;
import com.android.dialer.oem.MotorolaUtils;
import com.android.dialer.phonenumberutil.PhoneNumberHelper;
import com.android.dialer.storage.StorageComponent;
import com.android.dialer.util.DialerUtils;
import com.android.voicemail.VoicemailClient;
import com.android.voicemail.VoicemailComponent;
import com.android.voicemail.impl.transcribe.TranscriptionRatingHelper;
import com.google.internal.communications.voicemailtranscription.v1.TranscriptionRatingValue;
@@ -56,6 +67,9 @@ public class PhoneCallDetailsHelper
  /** The maximum number of icons will be shown to represent the call types in a group. */
  private static final int MAX_CALL_TYPE_ICONS = 3;

  private static final String PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY =
      "pref_voicemail_donation_promo_shown_key";

  private final Context context;
  private final Resources resources;
  private final CallLogCache callLogCache;
@@ -165,15 +179,10 @@ public class PhoneCallDetailsHelper

      String transcript = "";
      String branding = "";
      boolean showRatingPrompt = false;
      if (!TextUtils.isEmpty(details.transcription)) {
        transcript = details.transcription;

        // Show a transcription quality rating prompt or set the branding text if the voicemail was
        // transcribed by google
        if (shouldShowTranscriptionRating(details.transcriptionState, details.accountHandle)) {
          showRatingPrompt = true;
        } else if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
        if (details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
            || details.transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE_AND_RATED) {
          branding = resources.getString(R.string.voicemail_transcription_branding_text);
        }
@@ -198,28 +207,25 @@ public class PhoneCallDetailsHelper
      }

      views.voicemailTranscriptionView.setText(transcript);
      if (showRatingPrompt) {
        views.voicemailTranscriptionBrandingView.setVisibility(View.GONE);
      views.voicemailTranscriptionBrandingView.setText(branding);

      View ratingView = views.voicemailTranscriptionRatingView;
      if (shouldShowTranscriptionRating(details.transcriptionState, details.accountHandle)) {
        ratingView.setVisibility(View.VISIBLE);
        ratingView
            .findViewById(R.id.voicemail_transcription_rating_good)
            .setOnClickListener(
                view ->
                    recordTranscriptionRating(
                        TranscriptionRatingValue.GOOD_TRANSCRIPTION, details));
                        TranscriptionRatingValue.GOOD_TRANSCRIPTION, details, ratingView));
        ratingView
            .findViewById(R.id.voicemail_transcription_rating_bad)
            .setOnClickListener(
                view ->
                    recordTranscriptionRating(TranscriptionRatingValue.BAD_TRANSCRIPTION, details));
                    recordTranscriptionRating(
                        TranscriptionRatingValue.BAD_TRANSCRIPTION, details, ratingView));
      } else {
        views.voicemailTranscriptionRatingView.setVisibility(View.GONE);

        views.voicemailTranscriptionBrandingView.setVisibility(View.VISIBLE);
        views.voicemailTranscriptionBrandingView.setText(branding);
        ratingView.setVisibility(View.GONE);
      }
    }

@@ -237,16 +243,31 @@ public class PhoneCallDetailsHelper

  private boolean shouldShowTranscriptionRating(
      int transcriptionState, PhoneAccountHandle account) {
    // TODO(mdooley): add a configurable random element here?
    return transcriptionState == VoicemailCompat.TRANSCRIPTION_AVAILABLE
        && VoicemailComponent.get(context)
            .getVoicemailClient()
            .isVoicemailDonationEnabled(context, account);
    if (transcriptionState != VoicemailCompat.TRANSCRIPTION_AVAILABLE) {
      return false;
    }

    VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient();
    if (client.isVoicemailDonationEnabled(context, account)) {
      return true;
    }

    // Also show the rating option if voicemail transcription is available (but not enabled)
    // and the donation promo has not yet been shown.
    if (client.isVoicemailDonationAvailable(context) && !hasSeenVoicemailDonationPromo(context)) {
      return true;
    }

    return false;
  }

  private void recordTranscriptionRating(
      TranscriptionRatingValue ratingValue, PhoneCallDetails details) {
      TranscriptionRatingValue ratingValue, PhoneCallDetails details, View ratingView) {
    LogUtil.enterBlock("PhoneCallDetailsHelper.recordTranscriptionRating");

    if (shouldShowVoicemailDonationPromo(context)) {
      showVoicemailDonationPromo(ratingValue, details, ratingView);
    } else {
      TranscriptionRatingHelper.sendRating(
          context,
          ratingValue,
@@ -254,6 +275,125 @@ public class PhoneCallDetailsHelper
          this::onRatingSuccess,
          this::onRatingFailure);
    }
  }

  static boolean shouldShowVoicemailDonationPromo(Context context) {
    VoicemailClient client = VoicemailComponent.get(context).getVoicemailClient();
    return client.isVoicemailTranscriptionAvailable(context)
        && client.isVoicemailDonationAvailable(context)
        && !hasSeenVoicemailDonationPromo(context);
  }

  static boolean hasSeenVoicemailDonationPromo(Context context) {
    return StorageComponent.get(context.getApplicationContext())
        .unencryptedSharedPrefs()
        .getBoolean(PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY, false);
  }

  private void showVoicemailDonationPromo(
      TranscriptionRatingValue ratingValue, PhoneCallDetails details, View ratingView) {
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(getVoicemailDonationPromoContent());
    builder.setPositiveButton(
        R.string.voicemail_donation_promo_opt_in,
        new DialogInterface.OnClickListener() {
          @Override
          public void onClick(final DialogInterface dialog, final int button) {
            LogUtil.i("PhoneCallDetailsHelper.showVoicemailDonationPromo", "onClick");
            dialog.cancel();
            recordPromoShown(context);
            VoicemailComponent.get(context)
                .getVoicemailClient()
                .setVoicemailDonationEnabled(context, details.accountHandle, true);
            TranscriptionRatingHelper.sendRating(
                context,
                ratingValue,
                Uri.parse(details.voicemailUri),
                PhoneCallDetailsHelper.this::onRatingSuccess,
                PhoneCallDetailsHelper.this::onRatingFailure);
            ratingView.setVisibility(View.GONE);
          }
        });
    builder.setNegativeButton(
        R.string.voicemail_donation_promo_opt_out,
        new DialogInterface.OnClickListener() {
          @Override
          public void onClick(final DialogInterface dialog, final int button) {
            dialog.cancel();
            recordPromoShown(context);
            ratingView.setVisibility(View.GONE);
          }
        });
    builder.setCancelable(true);
    AlertDialog dialog = builder.create();

    // Use a custom title to prevent truncation, sigh
    TextView title = new TextView(context);
    title.setText(
        ratingValue == TranscriptionRatingValue.GOOD_TRANSCRIPTION
            ? R.string.voicemail_donation_promo_good_title
            : R.string.voicemail_donation_promo_bad_title);
    title.setTypeface(Typeface.create("sans-serif-medium", Typeface.NORMAL));
    title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
    title.setTextColor(ContextCompat.getColor(context, R.color.dialer_primary_text_color));
    title.setPadding(
        dpsToPixels(context, 24), /* left */
        dpsToPixels(context, 10), /* top */
        dpsToPixels(context, 24), /* right */
        dpsToPixels(context, 0)); /* bottom */
    dialog.setCustomTitle(title);

    dialog.show();

    // Make the message link clickable and adjust the appearance of the message and buttons
    TextView textView = (TextView) dialog.findViewById(android.R.id.message);
    textView.setLineSpacing(0, 1.2f);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
    if (positiveButton != null) {
      positiveButton.setTextColor(
          context
              .getResources()
              .getColor(R.color.voicemail_donation_promo_positive_button_text_color));
    }
    Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);
    if (negativeButton != null) {
      negativeButton.setTextColor(
          context
              .getResources()
              .getColor(R.color.voicemail_donation_promo_negative_button_text_color));
    }
  }

  private static int dpsToPixels(Context context, int dps) {
    return (int)
        (TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, dps, context.getResources().getDisplayMetrics()));
  }

  private static void recordPromoShown(Context context) {
    StorageComponent.get(context.getApplicationContext())
        .unencryptedSharedPrefs()
        .edit()
        .putBoolean(PREF_VOICEMAIL_DONATION_PROMO_SHOWN_KEY, true)
        .apply();
  }

  private SpannableString getVoicemailDonationPromoContent() {
    CharSequence content = context.getString(R.string.voicemail_donation_promo_content);
    CharSequence learnMore = context.getString(R.string.voicemail_donation_promo_learn_more);
    String learnMoreUrl = context.getString(R.string.voicemail_donation_promo_learn_more_url);
    SpannableString span = new SpannableString(content + "\n" + learnMore);
    int end = span.length();
    int start = end - learnMore.length();
    span.setSpan(new URLSpan(learnMoreUrl), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    span.setSpan(
        new TextAppearanceSpan(context, R.style.PromoLinkStyle),
        start,
        end,
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    return span;
  }

  @Override
  public void onRatingSuccess(Uri voicemailUri) {
+9 −18
Original line number Diff line number Diff line
@@ -193,36 +193,27 @@
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_weight="1"
                  android:gravity="start"
                  android:gravity="start|center_vertical"
                  android:focusable="true"
                  android:text="@string/voicemail_transcription_rating"/>

              <TextView
                  style="@style/TranscriptionQualityRatingLink"
              <ImageView
                  style="@style/TranscriptionQualityRatingIcon"
                  android:id="@+id/voicemail_transcription_rating_good"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:gravity="end"
                  android:focusable="true"
                  android:text="@string/voicemail_transcription_rating_good"/>

              <TextView
                  style="@style/TranscriptionQualityRating"
                  android:id="@+id/voicemail_transcription_rating_separator"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:gravity="end"
                  android:gravity="end|center_vertical"
                  android:focusable="true"
                  android:text="@string/voicemail_transcription_rating_separator"/>
                  android:src="@drawable/quantum_ic_thumb_up_grey600_24"/>

              <TextView
                  style="@style/TranscriptionQualityRatingLink"
              <ImageView
                  style="@style/TranscriptionQualityRatingIcon"
                  android:id="@+id/voicemail_transcription_rating_bad"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:gravity="end"
                  android:gravity="end|center_vertical"
                  android:focusable="true"
                  android:text="@string/voicemail_transcription_rating_bad"/>
                  android:src="@drawable/quantum_ic_thumb_down_grey600_24"/>

            </LinearLayout>

Loading