summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2018-02-10 00:42:01 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2018-02-10 00:42:01 +0000
commitd4264575756e50c249ce26e8e12206aa3b4257a6 (patch)
treedd60f1ac459e89c718c4f8ed28de2a38190f697c /java
parentdd4c4e0b44620bbd14b2fb4e086aa836974e8d40 (diff)
parent981a3e9d384f7c12d1847b1922b1f26115b0f4fd (diff)
Merge changes Ic71e99ed,Ic7dec5ee,If801b452,Iecb99c65,I8db7e08b, ...
* changes: Support GID1 for VVM configs Add VVM Config for Bouygues FR Fix new special codes Handle concurrently deleted rows in all updateSmartDialDatabase cursors Deleted some unused classes Replace ContactPhotoManager with GlidePhotoManager in new call log. Fix glide makefile
Diffstat (limited to 'java')
-rw-r--r--java/com/android/dialer/database/DialerDatabaseHelper.java25
-rw-r--r--java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java4
-rw-r--r--java/com/android/dialer/main/impl/MainPagerAdapter.java84
-rw-r--r--java/com/android/dialer/main/impl/StubFragment.java35
-rw-r--r--java/com/android/voicemail/impl/CarrierIdentifier.java71
-rw-r--r--java/com/android/voicemail/impl/CarrierIdentifierMatcher.java60
-rw-r--r--java/com/android/voicemail/impl/DialerVvmConfigManager.java (renamed from java/com/android/voicemail/impl/TelephonyVvmConfigManager.java)106
-rw-r--r--java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java16
-rw-r--r--java/com/android/voicemail/impl/res/xml/vvm_config.xml15
9 files changed, 269 insertions, 147 deletions
diff --git a/java/com/android/dialer/database/DialerDatabaseHelper.java b/java/com/android/dialer/database/DialerDatabaseHelper.java
index 8431a90a7..efff11ecc 100644
--- a/java/com/android/dialer/database/DialerDatabaseHelper.java
+++ b/java/com/android/dialer/database/DialerDatabaseHelper.java
@@ -375,7 +375,9 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
do {
if (deletedContactCursor.isNull(DeleteContactQuery.DELETED_CONTACT_ID)) {
- LogUtil.i("DialerDatabaseHelper.removeDeletedContacts", "null contact id, skipping row");
+ LogUtil.i(
+ "DialerDatabaseHelper.removeDeletedContacts",
+ "contact_id column null. Row was deleted during iteration, skipping");
continue;
}
@@ -455,6 +457,13 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
try {
updatedContactCursor.moveToPosition(-1);
while (updatedContactCursor.moveToNext()) {
+ if (updatedContactCursor.isNull(UpdatedContactQuery.UPDATED_CONTACT_ID)) {
+ LogUtil.i(
+ "DialerDatabaseHelper.removeUpdatedContacts",
+ "contact_id column null. Row was deleted during iteration, skipping");
+ continue;
+ }
+
final Long contactId = updatedContactCursor.getLong(UpdatedContactQuery.UPDATED_CONTACT_ID);
db.delete(Tables.SMARTDIAL_TABLE, SmartDialDbColumns.CONTACT_ID + "=" + contactId, null);
@@ -529,6 +538,13 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
while (updatedContactCursor.moveToNext()) {
insert.clearBindings();
+ if (updatedContactCursor.isNull(PhoneQuery.PHONE_ID)) {
+ LogUtil.i(
+ "DialerDatabaseHelper.insertUpdatedContactsAndNumberPrefix",
+ "_id column null. Row was deleted during iteration, skipping");
+ continue;
+ }
+
// Handle string columns which can possibly be null first. In the case of certain
// null columns (due to malformed rows possibly inserted by third-party apps
// or sync adapters), skip the phone number row.
@@ -607,6 +623,13 @@ public class DialerDatabaseHelper extends SQLiteOpenHelper {
final SQLiteStatement insert = db.compileStatement(sqlInsert);
while (nameCursor.moveToNext()) {
+ if (nameCursor.isNull(columnIndexContactId)) {
+ LogUtil.i(
+ "DialerDatabaseHelper.insertNamePrefixes",
+ "contact_id column null. Row was deleted during iteration, skipping");
+ continue;
+ }
+
/** Computes a list of prefixes of a given contact name. */
final ArrayList<String> namePrefixes =
SmartDialPrefix.generateNamePrefixes(context, nameCursor.getString(columnIndexName));
diff --git a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
index ca548ff23..2b7209eb5 100644
--- a/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
+++ b/java/com/android/dialer/dialpadview/SpecialCharSequenceMgr.java
@@ -85,9 +85,9 @@ public class SpecialCharSequenceMgr {
{
add("*#07#");
add("*#87#");
- add("#43#");
+ add("*#43#");
add("*#2727#");
- add("#88#");
+ add("*#88#");
}
};
diff --git a/java/com/android/dialer/main/impl/MainPagerAdapter.java b/java/com/android/dialer/main/impl/MainPagerAdapter.java
deleted file mode 100644
index d294640ee..000000000
--- a/java/com/android/dialer/main/impl/MainPagerAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2017 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.dialer.main.impl;
-
-import android.content.Context;
-import android.support.annotation.IntDef;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentPagerAdapter;
-import com.android.dialer.calllog.ui.NewCallLogFragment;
-import com.android.dialer.common.Assert;
-import com.android.dialer.voicemail.listui.NewVoicemailFragment;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/** Adapter for {@link MainActivity} ViewPager. */
-final class MainPagerAdapter extends FragmentPagerAdapter {
-
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({
- TabIndex.SPEED_DIAL,
- TabIndex.HISTORY,
- TabIndex.VOICEMAIL,
- })
- private @interface TabIndex {
- int SPEED_DIAL = 0;
- int HISTORY = 1;
- int VOICEMAIL = 2;
- }
-
- private final Context context;
-
- MainPagerAdapter(Context context, FragmentManager fragmentManager) {
- super(fragmentManager);
- this.context = context;
- }
-
- @Override
- public int getCount() {
- // TODO(calderwoodra): add logic to hide/show voicemail tab
- return 3;
- }
-
- @Override
- public Fragment getItem(@TabIndex int position) {
- // TODO(calderwoodra): implement tabs
- switch (position) {
- case TabIndex.VOICEMAIL:
- return new NewVoicemailFragment();
- case TabIndex.HISTORY:
- return new NewCallLogFragment();
- default:
- return new StubFragment();
- }
- }
-
- @Override
- public CharSequence getPageTitle(int position) {
- switch (position) {
- case TabIndex.SPEED_DIAL:
- return context.getString(R.string.tab_title_speed_dial);
- case TabIndex.HISTORY:
- return context.getString(R.string.tab_title_call_history);
- case TabIndex.VOICEMAIL:
- return context.getString(R.string.tab_title_voicemail);
- default:
- throw Assert.createIllegalStateFailException("Tab position with no title: " + position);
- }
- }
-}
diff --git a/java/com/android/dialer/main/impl/StubFragment.java b/java/com/android/dialer/main/impl/StubFragment.java
deleted file mode 100644
index 8e0accf29..000000000
--- a/java/com/android/dialer/main/impl/StubFragment.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2017 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.dialer.main.impl;
-
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-/** Stub Fragment for Dialer. */
-public class StubFragment extends Fragment {
-
- @Nullable
- @Override
- public View onCreateView(
- LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
- return inflater.inflate(R.layout.stub_fragment, container, false);
- }
-}
diff --git a/java/com/android/voicemail/impl/CarrierIdentifier.java b/java/com/android/voicemail/impl/CarrierIdentifier.java
new file mode 100644
index 000000000..82b6a2440
--- /dev/null
+++ b/java/com/android/voicemail/impl/CarrierIdentifier.java
@@ -0,0 +1,71 @@
+/*
+ * 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
+ */
+
+package com.android.voicemail.impl;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build.VERSION_CODES;
+import android.telecom.PhoneAccountHandle;
+import android.telephony.TelephonyManager;
+import com.google.auto.value.AutoValue;
+
+/** Identifies a carrier. */
+@AutoValue
+@TargetApi(VERSION_CODES.O)
+@SuppressWarnings("missingpermission")
+public abstract class CarrierIdentifier {
+
+ public abstract String mccMnc();
+
+ /**
+ * Group ID Level 1. Used to identify MVNO(Mobile Virtual Network Operators) who subleases other
+ * carrier's network and share their mccMnc. MVNO should have a GID1 different from the host.
+ */
+ public abstract String gid1();
+
+ /** Builder for the matcher */
+ @AutoValue.Builder
+ public abstract static class Builder {
+
+ public abstract Builder setMccMnc(String mccMnc);
+
+ public abstract Builder setGid1(String gid1);
+
+ public abstract CarrierIdentifier build();
+ }
+
+ public static Builder builder() {
+ return new AutoValue_CarrierIdentifier.Builder().setGid1("");
+ }
+
+ public static CarrierIdentifier forHandle(
+ Context context, PhoneAccountHandle phoneAccountHandle) {
+ TelephonyManager telephonyManager =
+ context
+ .getSystemService(TelephonyManager.class)
+ .createForPhoneAccountHandle(phoneAccountHandle);
+ if (telephonyManager == null) {
+ throw new IllegalArgumentException("Invalid PhoneAccountHandle");
+ }
+ String gid1 = telephonyManager.getGroupIdLevel1();
+ if (gid1 == null) {
+ gid1 = "";
+ }
+
+ return builder().setMccMnc(telephonyManager.getSimOperator()).setGid1(gid1).build();
+ }
+}
diff --git a/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java b/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java
new file mode 100644
index 000000000..d7c28fe77
--- /dev/null
+++ b/java/com/android/voicemail/impl/CarrierIdentifierMatcher.java
@@ -0,0 +1,60 @@
+/*
+ * 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
+ */
+
+package com.android.voicemail.impl;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Optional;
+
+/**
+ * Matches a {@link CarrierIdentifier}. Full equality check on CarrierIdentifiers is often unfit
+ * because non-MVNO carriers usually just specify the {@link CarrierIdentifier#mccMnc()} while their
+ * {@link CarrierIdentifier#gid1()} could be anything. This matcher ignore fields that are not
+ * specified in the matcher.
+ */
+@AutoValue
+public abstract class CarrierIdentifierMatcher {
+
+ public abstract String mccMnc();
+
+ public abstract Optional<String> gid1();
+
+ public static Builder builder() {
+ return new AutoValue_CarrierIdentifierMatcher.Builder();
+ }
+
+ /** Builder for the matcher */
+ @AutoValue.Builder
+ public abstract static class Builder {
+ public abstract Builder setMccMnc(String mccMnc);
+
+ public abstract Builder setGid1(String gid1);
+
+ public abstract CarrierIdentifierMatcher build();
+ }
+
+ public boolean matches(CarrierIdentifier carrierIdentifier) {
+ if (!mccMnc().equals(carrierIdentifier.mccMnc())) {
+ return false;
+ }
+ if (gid1().isPresent()) {
+ if (!gid1().get().equals(carrierIdentifier.gid1())) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java b/java/com/android/voicemail/impl/DialerVvmConfigManager.java
index ecf4e6ffc..7fa960e34 100644
--- a/java/com/android/voicemail/impl/TelephonyVvmConfigManager.java
+++ b/java/com/android/voicemail/impl/DialerVvmConfigManager.java
@@ -17,37 +17,86 @@
package com.android.voicemail.impl;
import android.content.Context;
+import android.net.Uri;
import android.os.PersistableBundle;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.util.ArrayMap;
import com.android.dialer.configprovider.ConfigProviderBindings;
import com.android.voicemail.impl.utils.XmlUtils;
+import com.google.common.collect.ComparisonChain;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.SortedSet;
+import java.util.TreeSet;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-/** Load and caches telephony vvm config from res/xml/vvm_config.xml */
-public class TelephonyVvmConfigManager {
+/** Load and caches dialer vvm config from res/xml/vvm_config.xml */
+public class DialerVvmConfigManager {
+ private static class ConfigEntry implements Comparable<ConfigEntry> {
- private static final String TAG = "TelephonyVvmCfgMgr";
+ final CarrierIdentifierMatcher matcher;
+ final PersistableBundle config;
- private static final boolean USE_DEBUG_CONFIG = false;
+ ConfigEntry(CarrierIdentifierMatcher matcher, PersistableBundle config) {
+ this.matcher = matcher;
+ this.config = config;
+ }
+
+ /**
+ * A more specific matcher should return a negative value to have higher priority over generic
+ * matchers.
+ */
+ @Override
+ public int compareTo(@NonNull ConfigEntry other) {
+ ComparisonChain comparisonChain = ComparisonChain.start();
+ if (!(matcher.gid1().isPresent() && other.matcher.gid1().isPresent())) {
+ if (matcher.gid1().isPresent()) {
+ return -1;
+ } else if (other.matcher.gid1().isPresent()) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } else {
+ comparisonChain = comparisonChain.compare(matcher.gid1().get(), other.matcher.gid1().get());
+ }
+
+ return comparisonChain.compare(matcher.mccMnc(), other.matcher.mccMnc()).result();
+ }
+ }
private static final String TAG_PERSISTABLEMAP = "pbundle_as_map";
+ /**
+ * A string array of MCCMNC the config applies to. Addtional filters should be appended as the URI
+ * query parameter format.
+ *
+ * <p>For example{@code <string-array name="mccmnc"> <item value="12345?gid1=foo"/> <item
+ * value="67890"/> </string-array> }
+ *
+ * @see #KEY_GID1
+ */
@VisibleForTesting static final String KEY_MCCMNC = "mccmnc";
+ /**
+ * Additional query parameter in {@link #KEY_MCCMNC} to filter by the Group ID level 1.
+ *
+ * @see CarrierIdentifierMatcher#gid1()
+ */
+ private static final String KEY_GID1 = "gid1";
+
private static final String KEY_FEATURE_FLAG_NAME = "feature_flag_name";
- private static Map<String, PersistableBundle> cachedConfigs;
+ private static Map<String, SortedSet<ConfigEntry>> cachedConfigs;
- private final Map<String, PersistableBundle> configs;
+ private final Map<String, SortedSet<ConfigEntry>> configs;
- public TelephonyVvmConfigManager(Context context) {
+ public DialerVvmConfigManager(Context context) {
if (cachedConfigs == null) {
cachedConfigs = loadConfigs(context, context.getResources().getXml(R.xml.vvm_config));
}
@@ -55,20 +104,26 @@ public class TelephonyVvmConfigManager {
}
@VisibleForTesting
- TelephonyVvmConfigManager(Context context, XmlPullParser parser) {
+ DialerVvmConfigManager(Context context, XmlPullParser parser) {
configs = loadConfigs(context, parser);
}
@Nullable
- public PersistableBundle getConfig(String mccMnc) {
- if (USE_DEBUG_CONFIG) {
- return configs.get("TEST");
+ public PersistableBundle getConfig(CarrierIdentifier carrierIdentifier) {
+ if (!configs.containsKey(carrierIdentifier.mccMnc())) {
+ return null;
+ }
+ for (ConfigEntry configEntry : configs.get(carrierIdentifier.mccMnc())) {
+ if (configEntry.matcher.matches(carrierIdentifier)) {
+ return configEntry.config;
+ }
}
- return configs.get(mccMnc);
+ return null;
}
- private static Map<String, PersistableBundle> loadConfigs(Context context, XmlPullParser parser) {
- Map<String, PersistableBundle> configs = new ArrayMap<>();
+ private static Map<String, SortedSet<ConfigEntry>> loadConfigs(
+ Context context, XmlPullParser parser) {
+ Map<String, SortedSet<ConfigEntry>> configs = new ArrayMap<>();
try {
ArrayList list = readBundleList(parser);
for (Object object : list) {
@@ -83,12 +138,27 @@ public class TelephonyVvmConfigManager {
continue;
}
- String[] mccMncs = bundle.getStringArray(KEY_MCCMNC);
- if (mccMncs == null) {
+ String[] identifiers = bundle.getStringArray(KEY_MCCMNC);
+ if (identifiers == null) {
throw new IllegalArgumentException("MCCMNC is null");
}
- for (String mccMnc : mccMncs) {
- configs.put(mccMnc, bundle);
+ for (String identifier : identifiers) {
+ Uri uri = Uri.parse(identifier);
+ String mccMnc = uri.getPath();
+ SortedSet<ConfigEntry> set;
+ if (configs.containsKey(mccMnc)) {
+ set = configs.get(mccMnc);
+ } else {
+ // Need a SortedSet so matchers will be sorted by priority.
+ set = new TreeSet<>();
+ configs.put(mccMnc, set);
+ }
+ CarrierIdentifierMatcher.Builder matcherBuilder = CarrierIdentifierMatcher.builder();
+ matcherBuilder.setMccMnc(mccMnc);
+ if (uri.getQueryParameterNames().contains(KEY_GID1)) {
+ matcherBuilder.setGid1(uri.getQueryParameter(KEY_GID1));
+ }
+ set.add(new ConfigEntry(matcherBuilder.build(), bundle));
}
}
} catch (IOException | XmlPullParserException e) {
diff --git a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
index ef62d2a75..f8a9e4bcf 100644
--- a/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
+++ b/java/com/android/voicemail/impl/OmtpVvmCarrierConfigHelper.java
@@ -55,6 +55,7 @@ import java.util.Set;
* <p>TODO(twyen): refactor this to an interface.
*/
@TargetApi(VERSION_CODES.O)
+@SuppressWarnings("missingpermission")
public class OmtpVvmCarrierConfigHelper {
private static final String TAG = "OmtpVvmCarrierCfgHlpr";
@@ -131,7 +132,8 @@ public class OmtpVvmCarrierConfigHelper {
carrierConfig = getCarrierConfig(telephonyManager);
telephonyConfig =
- new TelephonyVvmConfigManager(context).getConfig(telephonyManager.getSimOperator());
+ new DialerVvmConfigManager(context)
+ .getConfig(CarrierIdentifier.forHandle(context, phoneAccountHandle));
}
vvmType = getVvmType();
@@ -199,12 +201,6 @@ public class OmtpVvmCarrierConfigHelper {
}
@Nullable
- public Set<String> getCarrierVvmPackageNames() {
- Assert.checkArgument(isValid());
- return getCarrierVvmPackageNamesWithoutValidation();
- }
-
- @Nullable
private Set<String> getCarrierVvmPackageNamesWithoutValidation() {
Set<String> names = getCarrierVvmPackageNames(overrideConfig);
if (names != null) {
@@ -217,6 +213,12 @@ public class OmtpVvmCarrierConfigHelper {
return getCarrierVvmPackageNames(telephonyConfig);
}
+ @Nullable
+ public Set<String> getCarrierVvmPackageNames() {
+ Assert.checkArgument(isValid());
+ return getCarrierVvmPackageNamesWithoutValidation();
+ }
+
private static Set<String> getCarrierVvmPackageNames(@Nullable PersistableBundle bundle) {
if (bundle == null) {
return null;
diff --git a/java/com/android/voicemail/impl/res/xml/vvm_config.xml b/java/com/android/voicemail/impl/res/xml/vvm_config.xml
index 499bae293..ed7761abe 100644
--- a/java/com/android/voicemail/impl/res/xml/vvm_config.xml
+++ b/java/com/android/voicemail/impl/res/xml/vvm_config.xml
@@ -23,6 +23,21 @@
</pbundle_as_map>
<pbundle_as_map>
+ <!-- Bouygues France -->
+ <string-array name="mccmnc">
+ <item value="20820"/>
+ <item value="20821"/>
+ <item value="20888"/>
+ </string-array>
+ <string name="feature_flag_name">vvm_carrier_flag_20820</string>
+ <int
+ name="vvm_port_number_int"
+ value="5499"/>
+ <string name="vvm_destination_number_string">22344</string>
+ <string name="vvm_type_string">vvm_type_omtp</string>
+ </pbundle_as_map>
+
+ <pbundle_as_map>
<!-- Orange Belgium -->
<string-array name="mccmnc">
<item value="20610"/>