diff --git a/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java b/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java index b592089b..53dfaf1b 100644 --- a/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java +++ b/sdk/src/java/org/cyanogenmod/internal/cmparts/CMPartsPreference.java @@ -16,15 +16,16 @@ package org.cyanogenmod.internal.cmparts; import android.content.Context; +import android.os.Bundle; import android.util.AttributeSet; -import cyanogenmod.preference.SelfRemovingPreference; +import cyanogenmod.preference.RemotePreference; /** * A link to a remote preference screen which can be used with a minimum amount * of information. Supports summary updates asynchronously. */ -public class CMPartsPreference extends SelfRemovingPreference implements PartInfo.RemotePart { +public class CMPartsPreference extends RemotePreference { private static final String TAG = "CMPartsPreference"; @@ -32,38 +33,51 @@ public class CMPartsPreference extends SelfRemovingPreference implements PartInf private final Context mContext; - public CMPartsPreference(Context context, AttributeSet attrs) { - super(context, attrs, com.android.internal.R.attr.preferenceScreenStyle); + public CMPartsPreference(Context context, AttributeSet attrs, + int defStyle, int defStyleRes) { + super(context, attrs, defStyle, defStyleRes); mContext = context; mPart = PartsList.get(context).getPartInfo(getKey()); if (mPart == null) { throw new RuntimeException("Part not found: " + getKey()); } - if (!mPart.isAvailable()) { - setAvailable(false); - } - + updatePreference(); setIntent(mPart.getIntentForActivity()); + } - onRefresh(context, mPart); + public CMPartsPreference(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, 0); + } + + public CMPartsPreference(Context context, AttributeSet attrs) { + this(context, attrs, com.android.internal.R.attr.preferenceScreenStyle); } @Override - public void onAttached() { - super.onAttached(); - mPart.registerRemote(mContext, this); + public void onRemoteUpdated(Bundle bundle) { + if (bundle.containsKey(PartsList.EXTRA_PART)) { + PartInfo update = bundle.getParcelable(PartsList.EXTRA_PART); + if (update != null) { + mPart.updateFrom(update); + updatePreference(); + } + } } @Override - public void onDetached() { - super.onDetached(); - mPart.unregisterRemote(mContext, this); + protected String getRemoteKey(Bundle metaData) { + // remote key is the same as ours + return getKey(); } - @Override - public void onRefresh(Context context, PartInfo info) { - setTitle(mPart.getTitle()); - setSummary((CharSequence) mPart.getSummary()); + private void updatePreference() { + if (isAvailable() != mPart.isAvailable()) { + setAvailable(mPart.isAvailable()); + } + if (isAvailable()) { + setTitle(mPart.getTitle()); + setSummary(mPart.getSummary()); + } } } diff --git a/sdk/src/java/org/cyanogenmod/internal/cmparts/PartInfo.java b/sdk/src/java/org/cyanogenmod/internal/cmparts/PartInfo.java index 17998704..39c7cf9c 100644 --- a/sdk/src/java/org/cyanogenmod/internal/cmparts/PartInfo.java +++ b/sdk/src/java/org/cyanogenmod/internal/cmparts/PartInfo.java @@ -15,7 +15,6 @@ */ package org.cyanogenmod.internal.cmparts; -import android.content.Context; import android.content.Intent; import android.os.Parcel; import android.os.Parcelable; @@ -185,18 +184,6 @@ public class PartInfo implements Parcelable { return i; } - public interface RemotePart { - public void onRefresh(Context context, PartInfo info); - } - - public void registerRemote(Context context, final RemotePart remote) { - PartsList.get(context).registerRemotePart(mName, remote); - } - - public void unregisterRemote(Context context, final RemotePart remote) { - PartsList.get(context).unregisterRemotePart(mName, remote); - } - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public PartInfo createFromParcel(Parcel in) { diff --git a/sdk/src/java/org/cyanogenmod/internal/cmparts/PartsList.java b/sdk/src/java/org/cyanogenmod/internal/cmparts/PartsList.java index 7334dca6..3ab37a6a 100644 --- a/sdk/src/java/org/cyanogenmod/internal/cmparts/PartsList.java +++ b/sdk/src/java/org/cyanogenmod/internal/cmparts/PartsList.java @@ -15,20 +15,13 @@ */ package org.cyanogenmod.internal.cmparts; -import android.app.Activity; -import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; -import android.os.Bundle; -import android.os.UserHandle; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; @@ -43,8 +36,6 @@ import java.io.IOException; import java.util.Map; import java.util.Set; -import cyanogenmod.platform.Manifest; - import static com.android.internal.R.styleable.Preference; import static com.android.internal.R.styleable.Preference_fragment; import static com.android.internal.R.styleable.Preference_icon; @@ -60,27 +51,17 @@ public class PartsList { private static final boolean DEBUG = Log.isLoggable(TAG, Log.VERBOSE); - public static final String ACTION_PART_CHANGED = "org.cyanogenmod.cmparts.PART_CHANGED"; - public static final String ACTION_REFRESH_PART = "org.cyanogenmod.cmparts.REFRESH_PART"; - - public static final String EXTRA_PART = "part"; - public static final String EXTRA_PART_KEY = "key"; - public static final String EXTRA_PART_SUMMARY = "summary"; + public static final String EXTRA_PART = ":cm:part"; public static final String CMPARTS_PACKAGE = "org.cyanogenmod.cmparts"; public static final ComponentName CMPARTS_ACTIVITY = new ComponentName( CMPARTS_PACKAGE, CMPARTS_PACKAGE + ".PartsActivity"); - public static final ComponentName CMPARTS_REFRESHER = new ComponentName( - CMPARTS_PACKAGE, CMPARTS_PACKAGE + ".RefreshReceiver"); - public static final String PARTS_ACTION_PREFIX = CMPARTS_PACKAGE + ".parts"; private final Map mParts = new ArrayMap<>(); - private final Map> mRemotes = new ArrayMap<>(); - private final Context mContext; private static PartsList sInstance; @@ -228,98 +209,4 @@ public class PartsList { if (parser != null) parser.close(); } } - - public void registerRemotePart(final String key, final PartInfo.RemotePart remote) { - synchronized (mParts) { - if (DEBUG) { - Log.v(TAG, "registerRemotePart part=" + key + " remote=" + remote.toString()); - } - if (mRemotes.size() == 0) { - final IntentFilter filter = new IntentFilter(ACTION_PART_CHANGED); - mContext.registerReceiver(mPartChangedReceiver, filter, - Manifest.permission.MANAGE_REMOTE_PREFERENCES, null); - } - - Set remotes = mRemotes.get(key); - if (remotes == null) { - remotes = new ArraySet(); - mRemotes.put(key, remotes); - } - remotes.add(remote); - - final Intent i = new Intent(ACTION_REFRESH_PART); - i.setComponent(PartsList.CMPARTS_REFRESHER); - - i.putExtra(EXTRA_PART_KEY, key); - - // Send an ordered broadcast to request a refresh and receive the reply - // on the BroadcastReceiver. - mContext.sendOrderedBroadcastAsUser(i, UserHandle.CURRENT, - Manifest.permission.MANAGE_REMOTE_PREFERENCES, - new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - synchronized (mParts) { - refreshPartFromBundleLocked(getResultExtras(true)); - } - } - }, null, Activity.RESULT_OK, null, null); - } - } - - - private void refreshPartFromBundleLocked(Bundle result) { - PartInfo info = mParts.get(result.getString(EXTRA_PART_KEY)); - if (info != null) { - PartInfo updatedPart = (PartInfo) result.getParcelable(EXTRA_PART); - if (updatedPart != null) { - if (info.updateFrom(updatedPart)) { - Set remotes = mRemotes.get(info.getName()); - if (remotes != null && remotes.size() > 0) { - for (PartInfo.RemotePart remote : remotes) { - if (DEBUG) { - Log.d(TAG, "refresh remote=" + remote.toString() + - " info=" + info.toString()); - } - remote.onRefresh(mContext, info); - } - } - } - } - } - } - - public void unregisterRemotePart(String key, final PartInfo.RemotePart remote) { - synchronized (mParts) { - if (DEBUG) { - Log.d(TAG, "unregisterRemotePart: " + key + " remote=" + remote.toString()); - } - Set remotes = mRemotes.get(key); - if (remotes != null) { - remotes.remove(remote); - if (remotes.size() == 0) { - mRemotes.remove(key); - if (mRemotes.size() == 0) { - mContext.unregisterReceiver(mPartChangedReceiver); - } - } - } - } - } - - /** - * Receiver for asynchronous updates - */ - private final BroadcastReceiver mPartChangedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - synchronized (mParts) { - if (DEBUG) { - Log.d(TAG, "PART_CHANGED: " + intent.toString() + - " bundle: " + intent.getExtras().toString()); - } - refreshPartFromBundleLocked(intent.getExtras()); - } - } - }; }