Loading res/layout/conversation_onboarding.xml +0 −2 Original line number Diff line number Diff line Loading @@ -15,12 +15,10 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/onboarding" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:visibility="gone" android:orientation="vertical"> <ImageView Loading src/com/android/settings/notification/app/AllConversationsPreferenceController.java +1 −25 Original line number Diff line number Diff line Loading @@ -17,26 +17,18 @@ package com.android.settings.notification.app; import android.content.Context; import android.os.AsyncTask; import android.service.notification.ConversationChannelWrapper; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import com.android.settings.R; import com.android.settings.notification.NotificationBackend; import java.util.Collections; import java.util.List; public class AllConversationsPreferenceController extends ConversationListPreferenceController { private static final String KEY = "other_conversations"; private List<ConversationChannelWrapper> mConversations; public AllConversationsPreferenceController(Context context, NotificationBackend backend) { public AllConversationsPreferenceController(Context context, NotificationBackend backend) { super(context, backend); } Loading @@ -45,11 +37,6 @@ public class AllConversationsPreferenceController extends ConversationListPrefer return KEY; } @Override public boolean isAvailable() { return true; } @Override Preference getSummaryPreference() { Preference pref = new Preference(mContext); Loading @@ -63,15 +50,4 @@ public class AllConversationsPreferenceController extends ConversationListPrefer boolean matchesFilter(ConversationChannelWrapper conversation) { return !conversation.getNotificationChannel().isImportantConversation(); } @Override public void updateState(Preference preference) { PreferenceCategory pref = (PreferenceCategory) preference; // Load conversations mConversations = mBackend.getConversations(false).getList(); Collections.sort(mConversations, mConversationComparator); populateList(mConversations, pref); } } src/com/android/settings/notification/app/ConversationListPreferenceController.java +39 −24 Original line number Diff line number Diff line Loading @@ -25,8 +25,10 @@ import android.provider.Settings; import android.service.notification.ConversationChannelWrapper; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.applications.AppInfoBase; Loading @@ -38,14 +40,15 @@ import com.android.settingslib.widget.AppPreference; import java.text.Collator; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public abstract class ConversationListPreferenceController extends AbstractPreferenceController { private static final String SUMMARY_KEY_SUFFIX = "_summary"; protected final NotificationBackend mBackend; private PreferenceGroup mPreferenceGroup; public ConversationListPreferenceController(Context context, NotificationBackend backend) { public ConversationListPreferenceController(Context context, NotificationBackend backend) { super(context); mBackend = backend; } Loading @@ -55,44 +58,55 @@ public abstract class ConversationListPreferenceController extends AbstractPrefe return true; } protected void populateList(List<ConversationChannelWrapper> conversations, PreferenceGroup containerGroup) { containerGroup.setVisible(false); containerGroup.removeAll(); @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreferenceGroup = screen.findPreference(getPreferenceKey()); } /** * Updates the conversation list. * @return true if this controller has content to display. */ boolean updateList(List<ConversationChannelWrapper> conversations) { mPreferenceGroup.setVisible(false); mPreferenceGroup.removeAll(); if (conversations != null) { populateConversations(conversations, containerGroup); populateConversations(conversations); } if (containerGroup.getPreferenceCount() != 0) { boolean hasContent = mPreferenceGroup.getPreferenceCount() != 0; if (hasContent) { Preference summaryPref = getSummaryPreference(); if (summaryPref != null) { summaryPref.setKey(getPreferenceKey() + SUMMARY_KEY_SUFFIX); containerGroup.addPreference(summaryPref); mPreferenceGroup.addPreference(summaryPref); } containerGroup.setVisible(true); mPreferenceGroup.setVisible(true); } return hasContent; } abstract Preference getSummaryPreference(); abstract boolean matchesFilter(ConversationChannelWrapper conversation); protected void populateConversations(List<ConversationChannelWrapper> conversations, PreferenceGroup containerGroup) { int order = 100; for (ConversationChannelWrapper conversation : conversations) { if (conversation.getNotificationChannel().isDemoted() || !matchesFilter(conversation)) { continue; } containerGroup.addPreference(createConversationPref(conversation, order++)); } @VisibleForTesting void populateConversations(List<ConversationChannelWrapper> conversations) { AtomicInteger order = new AtomicInteger(100); conversations.stream() .filter(conversation -> !conversation.getNotificationChannel().isDemoted() && matchesFilter(conversation)) .sorted(mConversationComparator) .map(this::createConversationPref) .forEachOrdered(preference -> { preference.setOrder(order.getAndIncrement()); mPreferenceGroup.addPreference(preference); }); } protected Preference createConversationPref(final ConversationChannelWrapper conversation, int order) { private Preference createConversationPref(final ConversationChannelWrapper conversation) { AppPreference pref = new AppPreference(mContext); pref.setOrder(order); pref.setTitle(getTitle(conversation)); pref.setSummary(getSummary(conversation)); Loading Loading @@ -141,7 +155,8 @@ public abstract class ConversationListPreferenceController extends AbstractPrefe .setSourceMetricsCategory(SettingsEnums.NOTIFICATION_CONVERSATION_LIST_SETTINGS); } protected Comparator<ConversationChannelWrapper> mConversationComparator = @VisibleForTesting Comparator<ConversationChannelWrapper> mConversationComparator = new Comparator<ConversationChannelWrapper>() { private final Collator sCollator = Collator.getInstance(); @Override Loading src/com/android/settings/notification/app/ConversationListSettings.java +44 −6 Original line number Diff line number Diff line Loading @@ -19,8 +19,9 @@ package com.android.settings.notification.app; import android.app.people.IPeopleManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.os.ServiceManager; import android.util.Log; import android.service.notification.ConversationChannelWrapper; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; Loading @@ -32,12 +33,16 @@ import java.util.List; public class ConversationListSettings extends DashboardFragment { private static final String TAG = "ConvoListSettings"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); NotificationBackend mBackend = new NotificationBackend(); IPeopleManager mPs; protected List<AbstractPreferenceController> mControllers = new ArrayList<>(); private NoConversationsPreferenceController mNoConversationsController; private PriorityConversationsPreferenceController mPriorityConversationsController; private AllConversationsPreferenceController mAllConversationsController; private RecentConversationsPreferenceController mRecentConversationsController; private boolean mUpdatedInOnCreate = false; public ConversationListSettings() { mPs = IPeopleManager.Stub.asInterface( Loading @@ -62,10 +67,43 @@ public class ConversationListSettings extends DashboardFragment { @Override protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { mControllers = new ArrayList<>(); mControllers.add(new NoConversationsPreferenceController(context, mBackend, mPs)); mControllers.add(new PriorityConversationsPreferenceController(context, mBackend)); mControllers.add(new AllConversationsPreferenceController(context, mBackend)); mControllers.add(new RecentConversationsPreferenceController(context, mBackend, mPs)); mNoConversationsController = new NoConversationsPreferenceController(context); mControllers.add(mNoConversationsController); mPriorityConversationsController = new PriorityConversationsPreferenceController(context, mBackend); mControllers.add(mPriorityConversationsController); mAllConversationsController = new AllConversationsPreferenceController(context, mBackend); mControllers.add(mAllConversationsController); mRecentConversationsController = new RecentConversationsPreferenceController(context, mBackend, mPs); mControllers.add(mRecentConversationsController); return new ArrayList<>(mControllers); } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); update(); mUpdatedInOnCreate = true; } @Override public void onStart() { super.onStart(); if (mUpdatedInOnCreate) { mUpdatedInOnCreate = false; } else { update(); } } private void update() { List<ConversationChannelWrapper> conversationList = mBackend.getConversations(false).getList(); boolean hasContent = mPriorityConversationsController.updateList(conversationList) | mAllConversationsController.updateList(conversationList) | mRecentConversationsController.updateList(); mNoConversationsController.setAvailable(!hasContent); mNoConversationsController.displayPreference(getPreferenceScreen()); } } src/com/android/settings/notification/app/NoConversationsPreferenceController.java +8 −56 Original line number Diff line number Diff line Loading @@ -16,32 +16,18 @@ package com.android.settings.notification.app; import android.app.people.IPeopleManager; import android.content.Context; import android.os.AsyncTask; import android.os.RemoteException; import android.service.notification.ConversationChannelWrapper; import android.util.Log; import android.view.View; import androidx.preference.Preference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settings.R; import com.android.settings.notification.NotificationBackend; import com.android.settingslib.widget.LayoutPreference; class NoConversationsPreferenceController extends AbstractPreferenceController { public class NoConversationsPreferenceController extends ConversationListPreferenceController { private static String TAG = "NoConversationsPC"; private static final String KEY = "no_conversations"; private IPeopleManager mPs; private int mConversationCount = 0; private boolean mIsAvailable = false; public NoConversationsPreferenceController(Context context, NotificationBackend backend, IPeopleManager ps) { super(context, backend); mPs = ps; NoConversationsPreferenceController(Context context) { super(context); } @Override Loading @@ -51,44 +37,10 @@ public class NoConversationsPreferenceController extends ConversationListPrefere @Override public boolean isAvailable() { return true; } @Override Preference getSummaryPreference() { return null; return mIsAvailable; } @Override boolean matchesFilter(ConversationChannelWrapper conversation) { return false; } @Override public void updateState(Preference preference) { LayoutPreference pref = (LayoutPreference) preference; // Load conversations new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... unused) { mConversationCount = mBackend.getConversations(false).getList().size(); try { mConversationCount += mPs.getRecentConversations().getList().size(); } catch (RemoteException e) { Log.w(TAG, "Error calling PS", e); } return null; } @Override protected void onPostExecute(Void unused) { if (mContext == null) { return; } pref.findViewById(R.id.onboarding).setVisibility(mConversationCount == 0 ? View.VISIBLE : View.GONE); preference.setVisible(mConversationCount == 0); } }.execute(); void setAvailable(boolean available) { mIsAvailable = available; } } Loading
res/layout/conversation_onboarding.xml +0 −2 Original line number Diff line number Diff line Loading @@ -15,12 +15,10 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/onboarding" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:visibility="gone" android:orientation="vertical"> <ImageView Loading
src/com/android/settings/notification/app/AllConversationsPreferenceController.java +1 −25 Original line number Diff line number Diff line Loading @@ -17,26 +17,18 @@ package com.android.settings.notification.app; import android.content.Context; import android.os.AsyncTask; import android.service.notification.ConversationChannelWrapper; import androidx.preference.Preference; import androidx.preference.PreferenceCategory; import com.android.settings.R; import com.android.settings.notification.NotificationBackend; import java.util.Collections; import java.util.List; public class AllConversationsPreferenceController extends ConversationListPreferenceController { private static final String KEY = "other_conversations"; private List<ConversationChannelWrapper> mConversations; public AllConversationsPreferenceController(Context context, NotificationBackend backend) { public AllConversationsPreferenceController(Context context, NotificationBackend backend) { super(context, backend); } Loading @@ -45,11 +37,6 @@ public class AllConversationsPreferenceController extends ConversationListPrefer return KEY; } @Override public boolean isAvailable() { return true; } @Override Preference getSummaryPreference() { Preference pref = new Preference(mContext); Loading @@ -63,15 +50,4 @@ public class AllConversationsPreferenceController extends ConversationListPrefer boolean matchesFilter(ConversationChannelWrapper conversation) { return !conversation.getNotificationChannel().isImportantConversation(); } @Override public void updateState(Preference preference) { PreferenceCategory pref = (PreferenceCategory) preference; // Load conversations mConversations = mBackend.getConversations(false).getList(); Collections.sort(mConversations, mConversationComparator); populateList(mConversations, pref); } }
src/com/android/settings/notification/app/ConversationListPreferenceController.java +39 −24 Original line number Diff line number Diff line Loading @@ -25,8 +25,10 @@ import android.provider.Settings; import android.service.notification.ConversationChannelWrapper; import android.text.TextUtils; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.applications.AppInfoBase; Loading @@ -38,14 +40,15 @@ import com.android.settingslib.widget.AppPreference; import java.text.Collator; import java.util.Comparator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public abstract class ConversationListPreferenceController extends AbstractPreferenceController { private static final String SUMMARY_KEY_SUFFIX = "_summary"; protected final NotificationBackend mBackend; private PreferenceGroup mPreferenceGroup; public ConversationListPreferenceController(Context context, NotificationBackend backend) { public ConversationListPreferenceController(Context context, NotificationBackend backend) { super(context); mBackend = backend; } Loading @@ -55,44 +58,55 @@ public abstract class ConversationListPreferenceController extends AbstractPrefe return true; } protected void populateList(List<ConversationChannelWrapper> conversations, PreferenceGroup containerGroup) { containerGroup.setVisible(false); containerGroup.removeAll(); @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreferenceGroup = screen.findPreference(getPreferenceKey()); } /** * Updates the conversation list. * @return true if this controller has content to display. */ boolean updateList(List<ConversationChannelWrapper> conversations) { mPreferenceGroup.setVisible(false); mPreferenceGroup.removeAll(); if (conversations != null) { populateConversations(conversations, containerGroup); populateConversations(conversations); } if (containerGroup.getPreferenceCount() != 0) { boolean hasContent = mPreferenceGroup.getPreferenceCount() != 0; if (hasContent) { Preference summaryPref = getSummaryPreference(); if (summaryPref != null) { summaryPref.setKey(getPreferenceKey() + SUMMARY_KEY_SUFFIX); containerGroup.addPreference(summaryPref); mPreferenceGroup.addPreference(summaryPref); } containerGroup.setVisible(true); mPreferenceGroup.setVisible(true); } return hasContent; } abstract Preference getSummaryPreference(); abstract boolean matchesFilter(ConversationChannelWrapper conversation); protected void populateConversations(List<ConversationChannelWrapper> conversations, PreferenceGroup containerGroup) { int order = 100; for (ConversationChannelWrapper conversation : conversations) { if (conversation.getNotificationChannel().isDemoted() || !matchesFilter(conversation)) { continue; } containerGroup.addPreference(createConversationPref(conversation, order++)); } @VisibleForTesting void populateConversations(List<ConversationChannelWrapper> conversations) { AtomicInteger order = new AtomicInteger(100); conversations.stream() .filter(conversation -> !conversation.getNotificationChannel().isDemoted() && matchesFilter(conversation)) .sorted(mConversationComparator) .map(this::createConversationPref) .forEachOrdered(preference -> { preference.setOrder(order.getAndIncrement()); mPreferenceGroup.addPreference(preference); }); } protected Preference createConversationPref(final ConversationChannelWrapper conversation, int order) { private Preference createConversationPref(final ConversationChannelWrapper conversation) { AppPreference pref = new AppPreference(mContext); pref.setOrder(order); pref.setTitle(getTitle(conversation)); pref.setSummary(getSummary(conversation)); Loading Loading @@ -141,7 +155,8 @@ public abstract class ConversationListPreferenceController extends AbstractPrefe .setSourceMetricsCategory(SettingsEnums.NOTIFICATION_CONVERSATION_LIST_SETTINGS); } protected Comparator<ConversationChannelWrapper> mConversationComparator = @VisibleForTesting Comparator<ConversationChannelWrapper> mConversationComparator = new Comparator<ConversationChannelWrapper>() { private final Collator sCollator = Collator.getInstance(); @Override Loading
src/com/android/settings/notification/app/ConversationListSettings.java +44 −6 Original line number Diff line number Diff line Loading @@ -19,8 +19,9 @@ package com.android.settings.notification.app; import android.app.people.IPeopleManager; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Bundle; import android.os.ServiceManager; import android.util.Log; import android.service.notification.ConversationChannelWrapper; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; Loading @@ -32,12 +33,16 @@ import java.util.List; public class ConversationListSettings extends DashboardFragment { private static final String TAG = "ConvoListSettings"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); NotificationBackend mBackend = new NotificationBackend(); IPeopleManager mPs; protected List<AbstractPreferenceController> mControllers = new ArrayList<>(); private NoConversationsPreferenceController mNoConversationsController; private PriorityConversationsPreferenceController mPriorityConversationsController; private AllConversationsPreferenceController mAllConversationsController; private RecentConversationsPreferenceController mRecentConversationsController; private boolean mUpdatedInOnCreate = false; public ConversationListSettings() { mPs = IPeopleManager.Stub.asInterface( Loading @@ -62,10 +67,43 @@ public class ConversationListSettings extends DashboardFragment { @Override protected List<AbstractPreferenceController> createPreferenceControllers(Context context) { mControllers = new ArrayList<>(); mControllers.add(new NoConversationsPreferenceController(context, mBackend, mPs)); mControllers.add(new PriorityConversationsPreferenceController(context, mBackend)); mControllers.add(new AllConversationsPreferenceController(context, mBackend)); mControllers.add(new RecentConversationsPreferenceController(context, mBackend, mPs)); mNoConversationsController = new NoConversationsPreferenceController(context); mControllers.add(mNoConversationsController); mPriorityConversationsController = new PriorityConversationsPreferenceController(context, mBackend); mControllers.add(mPriorityConversationsController); mAllConversationsController = new AllConversationsPreferenceController(context, mBackend); mControllers.add(mAllConversationsController); mRecentConversationsController = new RecentConversationsPreferenceController(context, mBackend, mPs); mControllers.add(mRecentConversationsController); return new ArrayList<>(mControllers); } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); update(); mUpdatedInOnCreate = true; } @Override public void onStart() { super.onStart(); if (mUpdatedInOnCreate) { mUpdatedInOnCreate = false; } else { update(); } } private void update() { List<ConversationChannelWrapper> conversationList = mBackend.getConversations(false).getList(); boolean hasContent = mPriorityConversationsController.updateList(conversationList) | mAllConversationsController.updateList(conversationList) | mRecentConversationsController.updateList(); mNoConversationsController.setAvailable(!hasContent); mNoConversationsController.displayPreference(getPreferenceScreen()); } }
src/com/android/settings/notification/app/NoConversationsPreferenceController.java +8 −56 Original line number Diff line number Diff line Loading @@ -16,32 +16,18 @@ package com.android.settings.notification.app; import android.app.people.IPeopleManager; import android.content.Context; import android.os.AsyncTask; import android.os.RemoteException; import android.service.notification.ConversationChannelWrapper; import android.util.Log; import android.view.View; import androidx.preference.Preference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settings.R; import com.android.settings.notification.NotificationBackend; import com.android.settingslib.widget.LayoutPreference; class NoConversationsPreferenceController extends AbstractPreferenceController { public class NoConversationsPreferenceController extends ConversationListPreferenceController { private static String TAG = "NoConversationsPC"; private static final String KEY = "no_conversations"; private IPeopleManager mPs; private int mConversationCount = 0; private boolean mIsAvailable = false; public NoConversationsPreferenceController(Context context, NotificationBackend backend, IPeopleManager ps) { super(context, backend); mPs = ps; NoConversationsPreferenceController(Context context) { super(context); } @Override Loading @@ -51,44 +37,10 @@ public class NoConversationsPreferenceController extends ConversationListPrefere @Override public boolean isAvailable() { return true; } @Override Preference getSummaryPreference() { return null; return mIsAvailable; } @Override boolean matchesFilter(ConversationChannelWrapper conversation) { return false; } @Override public void updateState(Preference preference) { LayoutPreference pref = (LayoutPreference) preference; // Load conversations new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... unused) { mConversationCount = mBackend.getConversations(false).getList().size(); try { mConversationCount += mPs.getRecentConversations().getList().size(); } catch (RemoteException e) { Log.w(TAG, "Error calling PS", e); } return null; } @Override protected void onPostExecute(Void unused) { if (mContext == null) { return; } pref.findViewById(R.id.onboarding).setVisibility(mConversationCount == 0 ? View.VISIBLE : View.GONE); preference.setVisible(mConversationCount == 0); } }.execute(); void setAvailable(boolean available) { mIsAvailable = available; } }