Remove social widget.
Bug: 10328519
Change-Id: I075db4ca4dcbcf170b71c253d7232c3d3d7d17f4
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 51d6ac9..3ea1dcb 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -453,24 +453,6 @@
</intent-filter>
</activity>
- <!-- The widget that shows details and the social stream of a contact -->
- <receiver android:name=".socialwidget.SocialWidgetProvider"
- android:label="@string/social_widget_label" >
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
- </intent-filter>
- <meta-data android:name="android.appwidget.provider"
- android:resource="@xml/social_widget_info" />
- </receiver>
-
- <activity
- android:name=".socialwidget.SocialWidgetConfigureActivity"
- android:theme="@android:style/Theme.Translucent.NoTitleBar" >
- <intent-filter>
- <action android:name="android.intent.action.APPWIDGET_PICK" />
- </intent-filter>
- </activity>
-
<!-- Intercept Dialer Intents for devices without a phone.
This activity should have the same intent filters as the DialtactsActivity,
so that its capturing the same events. Omit android.intent.category.LAUNCHER, because
diff --git a/res/xml/social_widget_info.xml b/res/xml/social_widget_info.xml
deleted file mode 100644
index 1003c62..0000000
--- a/res/xml/social_widget_info.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 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.
--->
-
- <!-- It is enough to update once per day, as the widget watches the database for changes -->
-
-<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="260dip"
- android:minHeight="40dip"
- android:updatePeriodMillis="86400000"
- android:initialLayout="@layout/social_widget"
- android:previewImage="@drawable/contacts_widget_preview"
- android:configure="com.android.contacts.socialwidget.SocialWidgetConfigureActivity" >
-</appwidget-provider>
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java b/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java
deleted file mode 100644
index 39307bf..0000000
--- a/src/com/android/contacts/socialwidget/SocialWidgetConfigureActivity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2010 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.socialwidget;
-
-import android.app.Activity;
-import android.appwidget.AppWidgetManager;
-import android.content.Intent;
-import android.os.Bundle;
-import android.provider.ContactsContract.Contacts;
-
-public class SocialWidgetConfigureActivity extends Activity {
- private static final String KEY_LAUNCHED = "already_launched_picker_activity";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // If the user presses back, we want to cancel
- setResult(RESULT_CANCELED);
-
- // Don't launch contact-picker if we already launched it (for example, if
- // we launched it in a previous onCreate() and the device orientation changes
- // before the picker returns its result, then this activity will be recreated).
- if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_LAUNCHED)) return;
-
- // Forward the Intent to the picker
- final Intent pickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
- pickerIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
- startActivityForResult(pickerIntent, 0);
- }
-
- @Override
- protected void onSaveInstanceState(Bundle savedInstanceState) {
- super.onSaveInstanceState(savedInstanceState);
-
- // We know for sure that we've launched the contact-picker... see onCreate()
- savedInstanceState.putBoolean(KEY_LAUNCHED, true);
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // We came back from the Picker. If the user actually selected a contact,
- // return it now
- if (resultCode == Activity.RESULT_OK) {
- final Bundle extras = getIntent().getExtras();
- if (extras == null) throw new IllegalStateException("Intent extras are null");
- final int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
- AppWidgetManager.INVALID_APPWIDGET_ID);
-
- // Save the setting
- final SocialWidgetConfigureActivity context = SocialWidgetConfigureActivity.this;
- SocialWidgetSettings.getInstance().setContactUri(context, widgetId, data.getData());
-
- // Update the widget
- SocialWidgetProvider.loadWidgetData(
- context, AppWidgetManager.getInstance(this), widgetId, true);
-
- // Return OK so that the system won't remove the widget
- final Intent resultValue = new Intent();
- resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
- setResult(RESULT_OK, resultValue);
- }
- finish();
- }
-}
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
deleted file mode 100644
index e8b8e03..0000000
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (C) 2010 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.socialwidget;
-
-import android.app.PendingIntent;
-import android.appwidget.AppWidgetManager;
-import android.appwidget.AppWidgetProvider;
-import android.content.ContentUris;
-import android.content.Context;
-import android.content.Intent;
-import android.content.Loader;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Typeface;
-import android.net.Uri;
-import android.provider.ContactsContract.StreamItems;
-import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
-import android.text.style.AbsoluteSizeSpan;
-import android.text.style.StyleSpan;
-import android.util.Log;
-import android.util.SparseArray;
-import android.view.View;
-import android.widget.RemoteViews;
-
-import com.android.contacts.R;
-import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.model.Contact;
-import com.android.contacts.model.ContactLoader;
-import com.android.contacts.common.model.account.AccountType;
-import com.android.contacts.quickcontact.QuickContactBroadcastReceiver;
-import com.android.contacts.util.ContactBadgeUtil;
-import com.android.contacts.util.HtmlUtils;
-import com.android.contacts.util.StreamItemEntry;
-
-import java.util.List;
-
-public class SocialWidgetProvider extends AppWidgetProvider {
- private static final String TAG = "SocialWidgetProvider";
-
- /**
- * Max length of a snippet that is considered "short" and displayed in
- * a separate line.
- */
- private static final int SHORT_SNIPPET_LENGTH = 48;
-
- private static SparseArray<ContactLoader> sLoaders = new SparseArray<ContactLoader>();
-
- @Override
- public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
- for (int appWidgetId : appWidgetIds) {
- Log.d(TAG, "onUpdate called for " + appWidgetId);
- }
-
- for (int appWidgetId : appWidgetIds) {
- loadWidgetData(context, appWidgetManager, appWidgetId, false);
- }
- }
-
- @Override
- public void onDeleted(Context context, int[] appWidgetIds) {
- for (int appWidgetId : appWidgetIds) {
- ContactLoader loader = sLoaders.get(appWidgetId);
- if (loader != null) {
- Log.d(TAG, "Stopping loader for widget with id=" + appWidgetId);
- loader.reset();
- sLoaders.delete(appWidgetId);
- }
- }
- SocialWidgetSettings.getInstance().remove(context, appWidgetIds);
- }
-
- public static void loadWidgetData(final Context context,
- final AppWidgetManager appWidgetManager, final int widgetId, boolean forceLoad) {
- ContactLoader previousLoader = sLoaders.get(widgetId);
-
- if (previousLoader != null && !forceLoad) {
- previousLoader.startLoading();
- return;
- }
-
- if (previousLoader != null) {
- previousLoader.reset();
- }
-
- // Show that we are loading
- final RemoteViews loadingViews =
- new RemoteViews(context.getPackageName(), R.layout.social_widget);
- loadingViews.setTextViewText(R.id.name,
- context.getString(R.string.social_widget_loading));
- loadingViews.setViewVisibility(R.id.name, View.VISIBLE);
- loadingViews.setViewVisibility(R.id.name_and_snippet, View.GONE);
- appWidgetManager.updateAppWidget(widgetId, loadingViews);
-
- // Load
- final Uri contactUri =
- SocialWidgetSettings.getInstance().getContactUri(context, widgetId);
- if (contactUri == null) {
- // Not yet set-up (this can happen while the Configuration activity is visible)
- return;
- }
- final ContactLoader contactLoader = new ContactLoader(context, contactUri, false,
- false, true, false);
- contactLoader.registerListener(0,
- new ContactLoader.OnLoadCompleteListener<Contact>() {
- @Override
- public void onLoadComplete(Loader<Contact> loader,
- Contact contactData) {
- bindRemoteViews(context, widgetId, appWidgetManager, contactData);
- }
- });
- contactLoader.startLoading();
- sLoaders.append(widgetId, contactLoader);
- }
-
- private static void bindRemoteViews(final Context context, final int widgetId,
- final AppWidgetManager widgetManager, Contact contactData) {
- Log.d(TAG, "Loaded " + contactData.getLookupKey()
- + " for widget with id=" + widgetId);
- final RemoteViews views = new RemoteViews(context.getPackageName(),
- R.layout.social_widget);
-
- if (!contactData.isLoaded()) {
- setDisplayNameAndSnippet(context, views,
- context.getString(R.string.invalidContactMessage), null, null, null);
- setPhoto(views, ContactBadgeUtil.loadDefaultAvatarPhoto(context, false, false));
- } else {
- byte[] photo = contactData.getPhotoBinaryData();
- setPhoto(views, photo != null
- ? BitmapFactory.decodeByteArray(photo, 0, photo.length)
- : ContactBadgeUtil.loadDefaultAvatarPhoto(context, false, false));
-
- // TODO: Rotate between all the stream items?
-
- final Intent intent = new Intent(context, QuickContactBroadcastReceiver.class);
- intent.setData(contactData.getLookupUri());
- final PendingIntent pendingIntent = PendingIntent.getBroadcast(
- context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
- views.setOnClickPendingIntent(R.id.border, pendingIntent);
-
- setDisplayNameAndSnippet(context, views, contactData.getDisplayName(),
- contactData.getPhoneticName(), contactData.getStreamItems(), pendingIntent);
- }
-
- // Configure UI
- widgetManager.updateAppWidget(widgetId, views);
- }
-
-
- private static void setPhoto(RemoteViews views, Bitmap photo) {
- views.setImageViewBitmap(R.id.image, photo);
- }
-
- /**
- * Set the display name, phonetic name and the social snippet.
- */
- private static void setDisplayNameAndSnippet(Context context, RemoteViews views,
- CharSequence displayName, CharSequence phoneticName,
- List<StreamItemEntry> streamItems, PendingIntent defaultIntent) {
- SpannableStringBuilder sb = new SpannableStringBuilder();
-
- CharSequence name = displayName;
- // If there is no display name, use the default missing name string
- if (TextUtils.isEmpty(name)) {
- name = context.getString(R.string.missing_name);
- }
- if (!TextUtils.isEmpty(phoneticName)) {
- name = context.getString(R.string.widget_name_and_phonetic,
- name, phoneticName);
- }
- sb.append(name);
-
- AbsoluteSizeSpan sizeSpan = new AbsoluteSizeSpan(
- context.getResources().getDimensionPixelSize(R.dimen.widget_text_size_name));
- StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);
- sb.setSpan(sizeSpan, 0, name.length(), 0);
- sb.setSpan(styleSpan, 0, name.length(), 0);
-
- if (streamItems == null || streamItems.isEmpty()) {
- views.setTextViewText(R.id.name, sb);
- views.setViewVisibility(R.id.name, View.VISIBLE);
- views.setViewVisibility(R.id.name_and_snippet, View.GONE);
- // Don't set a pending intent if the intent is null, otherwise the system will try
- // to write the null intent to a Parcel.
- if (defaultIntent != null) {
- views.setOnClickPendingIntent(R.id.widget_container, defaultIntent);
- }
- } else {
- // TODO: Rotate between all the stream items?
- StreamItemEntry streamItem = streamItems.get(0);
- CharSequence status = HtmlUtils.fromHtml(context, streamItem.getText());
- if (status == null) {
- status = "";
- }
- if (status.length() <= SHORT_SNIPPET_LENGTH) {
- sb.append("\n");
- } else {
- sb.append(" ");
- }
- sb.append(status);
- views.setTextViewText(R.id.name_and_snippet, sb);
- views.setViewVisibility(R.id.name, View.GONE);
- views.setViewVisibility(R.id.name_and_snippet, View.VISIBLE);
- final AccountTypeManager manager = AccountTypeManager.getInstance(context);
- final AccountType accountType =
- manager.getAccountType(streamItem.getAccountType(), streamItem.getDataSet());
- if (accountType.getViewStreamItemActivity() != null) {
- final Uri uri = ContentUris.withAppendedId(StreamItems.CONTENT_URI,
- streamItem.getId());
- final Intent intent = new Intent(Intent.ACTION_VIEW, uri);
- intent.setClassName(accountType.syncAdapterPackageName,
- accountType.getViewStreamItemActivity());
- views.setOnClickPendingIntent(R.id.name_and_snippet_container,
- PendingIntent.getActivity(context, 0, intent, 0));
- }
- }
- }
-}
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetSettings.java b/src/com/android/contacts/socialwidget/SocialWidgetSettings.java
deleted file mode 100644
index 45a7dfb..0000000
--- a/src/com/android/contacts/socialwidget/SocialWidgetSettings.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2010 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.socialwidget;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.net.Uri;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-public class SocialWidgetSettings {
- private static final String TAG = "SocialWidgetSettings";
-
- // To migrate from earlier versions...
- private static final String LEGACY_PREFS_NAME = "WidgetSettings";
-
- // Prefix to use for all preferences used by this class.
- private static final String PREFERENCES_PREFIX = "SocialWidgetSettings_";
-
- private static final String CONTACT_URI_PREFIX = "CONTACT_URI_";
-
- private static final String KEY_MIGRATED = PREFERENCES_PREFIX + "settings_migrated";
-
- private static final SocialWidgetSettings sInstance = new SocialWidgetSettings();
-
- public static SocialWidgetSettings getInstance() {
- return sInstance;
- }
-
- private final String getPreferenceKey(int widgetId) {
- return PREFERENCES_PREFIX + CONTACT_URI_PREFIX + Integer.toString(widgetId);
- }
-
- public void remove(Context context, int[] widgetIds) {
- final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
- final Editor editor = settings.edit();
- for (int widgetId : widgetIds) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "remove(" + widgetId + ")");
- }
- editor.remove(getPreferenceKey(widgetId));
- }
- editor.apply();
- }
-
- public Uri getContactUri(Context context, int widgetId) {
- final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
-
- ensureMigrated(context, settings);
-
- final String resultString = settings.getString(getPreferenceKey(widgetId), null);
- final Uri result = resultString == null ? null : Uri.parse(resultString);
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "getContactUri(" + widgetId + ") --> " + result);
- }
- return result;
- }
-
- public void setContactUri(Context context, int widgetId, Uri contactLookupUri) {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "setContactUri(" + widgetId + ", " + contactLookupUri + ")");
- }
- final SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(context);
- final Editor editor = settings.edit();
- if (contactLookupUri == null) {
- editor.remove(getPreferenceKey(widgetId));
- } else {
- editor.putString(getPreferenceKey(widgetId), contactLookupUri.toString());
- }
- editor.apply();
- }
-
- private void ensureMigrated(Context context, SharedPreferences settings) {
- if (settings.getBoolean(KEY_MIGRATED, false)) {
- return; // Migrated already
- }
-
- Log.i(TAG, "Migrating widget settings...");
-
- // Old preferences only had the "CONTACT_URI_" prefix.
- // New preferences have the "SocialWidgetSettings_CONTACT_URI_" prefix.
- // So just copy all the entries with adding "SocialWidgetSettings_" to their key names.
-
- final SharedPreferences.Editor editor = settings.edit();
-
- final SharedPreferences legacySettings =
- context.getSharedPreferences(LEGACY_PREFS_NAME, Context.MODE_PRIVATE);
- for (String key : legacySettings.getAll().keySet()) {
- final String value = legacySettings.getString(key, null);
- if (value == null) continue; // Just in case.
-
- Log.i(TAG, "Found: " + key + ": " + value);
-
- editor.putString(PREFERENCES_PREFIX + key, value);
- }
-
- editor.apply();
- settings.edit().putBoolean(KEY_MIGRATED, true).apply();
- }
-}