[automerger skipped] Import translations. DO NOT MERGE ANYWHERE am: aa5466b228 -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Contacts/+/23467174
Change-Id: I9c27965beaf28c37600f8b8757a22d0daf9a59da
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e974863..0bd96cd 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -45,7 +45,6 @@
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SET_DEFAULT_ACCOUNT_FOR_CONTACTS"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
<!-- Following used for Contact metadata syncing -->
@@ -55,7 +54,7 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- Required in P to run Service.startForeground() -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
- <uses-permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS" />
+ <uses-permission android:name="android.permission.HIDE_OVERLAY_WINDOWS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-feature
@@ -475,7 +474,8 @@
<!-- Service to import contacts from the SIM card -->
<service
android:name=".SimImportService"
- android:exported="false"/>
+ android:exported="false"
+ android:foregroundServiceType="shortService" />
<!-- Attaches a photo to a contact. Started from external applications -->
<activity
@@ -547,7 +547,8 @@
<service
android:name=".vcard.VCardService"
- android:exported="false"/>
+ android:exported="false"
+ android:foregroundServiceType="dataSync"/>
<!-- end vCard related -->
<!-- Intercept Dialer Intents for devices without a phone.
diff --git a/src/com/android/contacts/NfcHandler.java b/src/com/android/contacts/NfcHandler.java
deleted file mode 100644
index 07b3f06..0000000
--- a/src/com/android/contacts/NfcHandler.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2011 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.android.contacts;
-
-import android.app.Activity;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.net.Uri;
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcEvent;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Profile;
-import android.util.Log;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-/**
- * This class implements sharing the currently displayed
- * contact to another device using NFC. NFC sharing is only
- * enabled when the activity is in the foreground and resumed.
- * When an NFC link is established, {@link #createMessage}
- * will be called to create the data to be sent over the link,
- * which is a vCard in this case.
- */
-public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback {
-
- private static final String TAG = "ContactNfcHandler";
- private static final String PROFILE_LOOKUP_KEY = "profile";
- private final Context mContext;
- private final Uri mContactUri;
-
- /* Register NFC handler. This should be called in activities' onCreate(), or similar methods */
- public static void register(Activity activity, Uri contactUri) {
- NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity.getApplicationContext());
- if (adapter == null) {
- return; // NFC not available on this device
- }
- adapter.setNdefPushMessageCallback(new NfcHandler(activity, contactUri), activity);
- }
-
- public NfcHandler(Context context, Uri contactUri) {
- mContext = context;
- mContactUri = contactUri;
- }
-
- @Override
- public NdefMessage createNdefMessage(NfcEvent event) {
- ContentResolver resolver = mContext.getContentResolver();
- if (mContactUri != null) {
- final String lookupKey = Uri.encode(mContactUri.getPathSegments().get(2));
- final Uri shareUri;
- // TODO find out where to get this constant from, or find another way
- // of determining this.
- if (lookupKey.equals(PROFILE_LOOKUP_KEY)) {
- shareUri = Profile.CONTENT_VCARD_URI.buildUpon().
- appendQueryParameter(Contacts.QUERY_PARAMETER_VCARD_NO_PHOTO, "true").
- build();
- } else {
- shareUri = Contacts.CONTENT_VCARD_URI.buildUpon().
- appendPath(lookupKey).
- appendQueryParameter(Contacts.QUERY_PARAMETER_VCARD_NO_PHOTO, "true").
- build();
- }
- ByteArrayOutputStream ndefBytes = new ByteArrayOutputStream();
- byte[] buffer = new byte[1024];
- int r;
- try {
- InputStream vcardInputStream = resolver.openInputStream(shareUri);
- while ((r = vcardInputStream.read(buffer)) > 0) {
- ndefBytes.write(buffer, 0, r);
- }
-
- NdefRecord record = NdefRecord.createMime("text/x-vcard", ndefBytes.toByteArray());
- return new NdefMessage(record);
- } catch (IOException e) {
- Log.e(TAG, "IOException creating vcard.");
- return null;
- }
- } else {
- Log.w(TAG, "No contact URI to share.");
- return null;
- }
- }
-}
diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java
index 74a0df6..2af25f8 100644
--- a/src/com/android/contacts/activities/ContactEditorActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorActivity.java
@@ -314,6 +314,8 @@
public void onCreate(Bundle savedState) {
super.onCreate(savedState);
+ getWindow().setHideOverlayWindows(true);
+
RequestPermissionsActivity.startPermissionActivityIfNeeded(this);
final Intent intent = getIntent();
diff --git a/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java b/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
index cf2ce9c..64283d2 100644
--- a/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
+++ b/src/com/android/contacts/activities/ContactEditorSpringBoardActivity.java
@@ -242,6 +242,7 @@
finish();
}
+ @SuppressWarnings("MissingSuperCall") // TODO: Fix me
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Ignore failed requests
diff --git a/src/com/android/contacts/activities/ContactSelectionActivity.java b/src/com/android/contacts/activities/ContactSelectionActivity.java
index 2057c9d..9273c61 100644
--- a/src/com/android/contacts/activities/ContactSelectionActivity.java
+++ b/src/com/android/contacts/activities/ContactSelectionActivity.java
@@ -107,8 +107,7 @@
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
- getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
- .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ getWindow().setHideOverlayWindows(true);
RequestPermissionsActivity.startPermissionActivityIfNeeded(this);
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 412c067..ceb3d59 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -421,6 +421,7 @@
getWindow().setBackgroundDrawable(null);
}
+ @SuppressWarnings("MissingSuperCall") // TODO: Fix me
@Override
protected void onNewIntent(Intent intent) {
final String action = intent.getAction();
@@ -603,6 +604,7 @@
onSyncStateUpdated();
}
+ @SuppressWarnings("MissingSuperCall") // TODO: Fix me
@Override
public void onMultiWindowModeChanged(boolean entering) {
initializeHomeVisibility();
diff --git a/src/com/android/contacts/activities/RequestImportVCardPermissionsActivity.java b/src/com/android/contacts/activities/RequestImportVCardPermissionsActivity.java
index 224339a..2f17fe7 100644
--- a/src/com/android/contacts/activities/RequestImportVCardPermissionsActivity.java
+++ b/src/com/android/contacts/activities/RequestImportVCardPermissionsActivity.java
@@ -28,9 +28,7 @@
// Contacts group
permission.GET_ACCOUNTS,
permission.READ_CONTACTS,
- permission.WRITE_CONTACTS,
- // Storage group
- permission.READ_EXTERNAL_STORAGE,
+ permission.WRITE_CONTACTS
};
@Override
diff --git a/src/com/android/contacts/dialog/CallSubjectDialog.java b/src/com/android/contacts/dialog/CallSubjectDialog.java
index 036a0f3..ffce0f5 100644
--- a/src/com/android/contacts/dialog/CallSubjectDialog.java
+++ b/src/com/android/contacts/dialog/CallSubjectDialog.java
@@ -274,6 +274,7 @@
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ getWindow().setHideOverlayWindows(true);
mAnimationDuration = getResources().getInteger(R.integer.call_subject_animation_duration);
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
mPhotoSize = getResources().getDimensionPixelSize(
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index ce4b9bc..52c20e6 100755
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -98,6 +98,7 @@
import com.google.common.collect.Lists;
import java.io.FileNotFoundException;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -132,11 +133,10 @@
private static final String KEY_PHOTO_RAW_CONTACT_ID = "photo_raw_contact_id";
private static final String KEY_UPDATED_PHOTOS = "updated_photos";
- private static final List<String> VALID_INTENT_ACTIONS = new ArrayList<String>() {{
- add(Intent.ACTION_EDIT);
- add(Intent.ACTION_INSERT);
- add(ContactEditorActivity.ACTION_SAVE_COMPLETED);
- }};
+ private static final List<String> VALID_INTENT_ACTIONS = Arrays.asList(
+ Intent.ACTION_EDIT,
+ Intent.ACTION_INSERT,
+ ContactEditorActivity.ACTION_SAVE_COMPLETED);
private static final String KEY_ACTION = "action";
private static final String KEY_URI = "uri";
diff --git a/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java b/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java
index df22773..461a752 100644
--- a/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java
+++ b/src/com/android/contacts/editor/SuggestionEditConfirmationDialogFragment.java
@@ -47,7 +47,7 @@
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(R.string.aggregation_suggestion_edit_dialog_message)
- .setPositiveButton(android.R.string.yes,
+ .setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
@@ -61,7 +61,7 @@
}
}
)
- .setNegativeButton(android.R.string.no, null)
+ .setNegativeButton(android.R.string.cancel, null)
.create();
}
}
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index 3b66739..b0369c7 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -90,7 +90,6 @@
private static final int LOADER_GROUP_METADATA = 100;
private static final int MSG_FAIL_TO_LOAD = 1;
- private static final int RESULT_GROUP_ADD_MEMBER = 100;
/** Filters out duplicate contacts. */
private class FilterCursorWrapper extends CursorWrapper {
@@ -448,7 +447,7 @@
private void startGroupAddMemberActivity() {
startActivityForResult(GroupUtil.createPickMemberIntent(getContext(), mGroupMetaData,
- getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
+ getMemberContactIds()), GroupUtil.RESULT_GROUP_ADD_MEMBER);
}
@Override
@@ -504,7 +503,7 @@
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK || data == null
- || requestCode != RESULT_GROUP_ADD_MEMBER) {
+ || requestCode != GroupUtil.RESULT_GROUP_ADD_MEMBER) {
return;
}
@@ -776,7 +775,7 @@
@Override
public void onClick(View v) {
startActivityForResult(GroupUtil.createPickMemberIntent(getContext(),
- mGroupMetaData, getMemberContactIds()), RESULT_GROUP_ADD_MEMBER);
+ mGroupMetaData, getMemberContactIds()), GroupUtil.RESULT_GROUP_ADD_MEMBER);
}
});
return view;
diff --git a/src/com/android/contacts/group/GroupUtil.java b/src/com/android/contacts/group/GroupUtil.java
index dae4f4e..17998f8 100644
--- a/src/com/android/contacts/group/GroupUtil.java
+++ b/src/com/android/contacts/group/GroupUtil.java
@@ -58,7 +58,8 @@
public static final String ACTION_SWITCH_GROUP = "switchGroup";
public static final String ACTION_UPDATE_GROUP = "updateGroup";
- public static final int RESULT_SEND_TO_SELECTION = 100;
+ public static final int RESULT_GROUP_ADD_MEMBER = 100;
+ public static final int RESULT_SEND_TO_SELECTION = 200;
// System IDs of FFC groups in Google accounts
private static final Set<String> FFC_GROUPS =
diff --git a/src/com/android/contacts/list/CustomContactListFilterActivity.java b/src/com/android/contacts/list/CustomContactListFilterActivity.java
index 425ee7e..5bc3c35 100644
--- a/src/com/android/contacts/list/CustomContactListFilterActivity.java
+++ b/src/com/android/contacts/list/CustomContactListFilterActivity.java
@@ -982,8 +982,8 @@
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new AlertDialog.Builder(getActivity(), getTheme())
.setMessage(R.string.leave_customize_confirmation_dialog_message)
- .setNegativeButton(android.R.string.no, null)
- .setPositiveButton(android.R.string.yes, this)
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, this)
.create();
}
diff --git a/src/com/android/contacts/model/SimContact.java b/src/com/android/contacts/model/SimContact.java
index 820e346..ee0e6dc 100644
--- a/src/com/android/contacts/model/SimContact.java
+++ b/src/com/android/contacts/model/SimContact.java
@@ -172,11 +172,7 @@
@Override
public int hashCode() {
- int result = (int) (mRecordNumber ^ (mRecordNumber >>> 32));
- result = 31 * result + (mName != null ? mName.hashCode() : 0);
- result = 31 * result + (mPhone != null ? mPhone.hashCode() : 0);
- result = 31 * result + Arrays.hashCode(mEmails);
- return result;
+ return Objects.hash(mRecordNumber, mName, mPhone, Arrays.hashCode(mEmails));
}
@Override
diff --git a/src/com/android/contacts/model/dataitem/ImDataItem.java b/src/com/android/contacts/model/dataitem/ImDataItem.java
index a0e087c..a142585 100644
--- a/src/com/android/contacts/model/dataitem/ImDataItem.java
+++ b/src/com/android/contacts/model/dataitem/ImDataItem.java
@@ -23,6 +23,8 @@
import android.provider.ContactsContract.CommonDataKinds.Im;
import android.text.TextUtils;
+import java.util.Objects;
+
/**
* Represents an IM data item, wrapping the columns in
* {@link ContactsContract.CommonDataKinds.Im}.
@@ -101,7 +103,7 @@
return that.getProtocol() == Im.PROTOCOL_CUSTOM;
}
return true;
- } else if (getProtocol() != that.getProtocol()) {
+ } else if (!Objects.equals(getProtocol(), that.getProtocol())) {
return false;
} else if (getProtocol() == Im.PROTOCOL_CUSTOM &&
!TextUtils.equals(getCustomProtocol(), that.getCustomProtocol())) {
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 5b144e1..35fc2cc 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -104,7 +104,6 @@
import com.android.contacts.ContactsActivity;
import com.android.contacts.ContactsUtils;
import com.android.contacts.DynamicShortcuts;
-import com.android.contacts.NfcHandler;
import com.android.contacts.R;
import com.android.contacts.ShortcutIntentBuilder;
import com.android.contacts.ShortcutIntentBuilder.OnShortcutIntentCreatedListener;
@@ -990,7 +989,6 @@
}
};
mEntriesAndActionsTask.execute();
- NfcHandler.register(this, mContactData.getLookupUri());
}
private void bindDataToCards(Cp2DataCardModel cp2DataCardModel) {
@@ -1486,6 +1484,11 @@
final String dataString = event.buildDataStringForDisplay(context, kind);
final Calendar cal = DateUtils.parseDate(dataString, false);
if (cal != null) {
+ final int eventType = event.getContentValues().getAsInteger(Event.TYPE);
+ if (eventType == Event.TYPE_ANNIVERSARY || eventType == Event.TYPE_BIRTHDAY) {
+ // setting the year to 0 makes a click open the coming birthday
+ cal.set(Calendar.YEAR, 0);
+ }
final Date nextAnniversary =
DateUtils.getNextAnnualDate(cal);
final Uri.Builder builder = CalendarContract.CONTENT_URI.buildUpon();
diff --git a/src/com/android/contacts/vcard/ImportVCardActivity.java b/src/com/android/contacts/vcard/ImportVCardActivity.java
index 38367c4..6ddb8fa 100644
--- a/src/com/android/contacts/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ImportVCardActivity.java
@@ -546,8 +546,7 @@
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
- getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
- .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ getWindow().setHideOverlayWindows(true);
Uri sourceUri = getIntent().getData();
diff --git a/src/com/android/contacts/vcard/ImportVCardDialogFragment.java b/src/com/android/contacts/vcard/ImportVCardDialogFragment.java
index 521a610..7ad67d1 100644
--- a/src/com/android/contacts/vcard/ImportVCardDialogFragment.java
+++ b/src/com/android/contacts/vcard/ImportVCardDialogFragment.java
@@ -68,7 +68,7 @@
return new AlertDialog.Builder(getActivity())
.setIconAttribute(android.R.attr.alertDialogIcon)
.setMessage(R.string.import_from_vcf_file_confirmation_message)
- .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
final Listener listener = (Listener) getActivity();
@@ -77,7 +77,7 @@
}
}
})
- .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
+ .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
final Listener listener = (Listener) getActivity();
diff --git a/src/com/android/contacts/vcard/SelectAccountActivity.java b/src/com/android/contacts/vcard/SelectAccountActivity.java
index eb13e50..8ead5fa 100644
--- a/src/com/android/contacts/vcard/SelectAccountActivity.java
+++ b/src/com/android/contacts/vcard/SelectAccountActivity.java
@@ -52,8 +52,7 @@
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
- getWindow().addSystemFlags(android.view.WindowManager.LayoutParams
- .SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ getWindow().setHideOverlayWindows(true);
// There's three possibilities:
// - more than one accounts -> ask the user
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index 075d6bb..5e647c4 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -16,6 +16,7 @@
package com.android.contacts.vcard;
import android.app.Notification;
+import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.media.MediaScannerConnection;
@@ -129,6 +130,10 @@
VCardCommonArguments.ARG_CALLING_ACTIVITY);
} else {
mCallingActivity = null;
+ // The intent will be null if the service is restarted after the app
+ // is killed but the notification may still exist so remove it.
+ NotificationManager nm = getSystemService(NotificationManager.class);
+ nm.cancelAll();
}
return START_STICKY;
}
@@ -255,6 +260,9 @@
}
}
} else {
+ // In case notification of import is still present and app is killed remove it
+ NotificationManager nm = getSystemService(NotificationManager.class);
+ nm.cancel(NotificationImportExportListener.DEFAULT_NOTIFICATION_TAG, jobId);
Log.w(LOG_TAG, String.format("Tried to remove unknown job (id: %d)", jobId));
}
stopServiceIfAppropriate();