Fix didnt work, new fix and tests

This commit is contained in:
Dominik 2012-11-19 22:18:25 +01:00
parent 949035b009
commit c36fdbd3f8
12 changed files with 158 additions and 22 deletions

View File

@ -31,6 +31,10 @@
android:name=".AidlDemoActivity" android:name=".AidlDemoActivity"
android:label="Aidl Demo" android:label="Aidl Demo"
android:windowSoftInputMode="stateHidden" /> android:windowSoftInputMode="stateHidden" />
<activity
android:name=".ContentProviderDemoActivity"
android:label="Content Provider Demo"
android:windowSoftInputMode="stateHidden" />
</application> </application>
</manifest> </manifest>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/content_provider_test1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="test1OnClick"
android:text="Test 1" />
<Button
android:id="@+id/content_provider_test2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="test2OnClick"
android:text="Test 2" />
<EditText
android:id="@+id/content_provider_output"
android:layout_width="match_parent"
android:layout_height="150dip"
android:text="output"
android:textAppearance="@android:style/TextAppearance.Small" />
</LinearLayout>
</ScrollView>

View File

@ -11,5 +11,10 @@
android:key="aidl_demo" android:key="aidl_demo"
android:title="AIDL Demo" /> android:title="AIDL Demo" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="Content Provider" >
<Preference
android:key="content_provider_demo"
android:title="Content Provider Demo" />
</PreferenceCategory>
</PreferenceScreen> </PreferenceScreen>

View File

@ -1,3 +1,19 @@
/*
* Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
*
* 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 org.thialfihar.android.apg.demo; package org.thialfihar.android.apg.demo;
import org.thialfihar.android.apg.integration.ApgData; import org.thialfihar.android.apg.integration.ApgData;
@ -17,7 +33,6 @@ import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.view.View; import android.view.View;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
public class AidlDemoActivity extends Activity { public class AidlDemoActivity extends Activity {
Activity mActivity; Activity mActivity;

View File

@ -30,6 +30,7 @@ public class BaseActivity extends PreferenceActivity {
private Preference mIntentDemo; private Preference mIntentDemo;
private Preference mAidlDemo; private Preference mAidlDemo;
private Preference mContentProviderDemo;
/** /**
* Called when the activity is first created. * Called when the activity is first created.
@ -46,6 +47,7 @@ public class BaseActivity extends PreferenceActivity {
// find preferences // find preferences
mIntentDemo = (Preference) findPreference("intent_demo"); mIntentDemo = (Preference) findPreference("intent_demo");
mAidlDemo = (Preference) findPreference("aidl_demo"); mAidlDemo = (Preference) findPreference("aidl_demo");
mContentProviderDemo = (Preference) findPreference("content_provider_demo");
mIntentDemo.setOnPreferenceClickListener(new OnPreferenceClickListener() { mIntentDemo.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override @Override
@ -64,6 +66,15 @@ public class BaseActivity extends PreferenceActivity {
return false; return false;
} }
}); });
mContentProviderDemo.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
startActivity(new Intent(mActivity, ContentProviderDemoActivity.class));
return false;
}
});
} }
} }

View File

@ -0,0 +1,68 @@
/*
* Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
*
* 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 org.thialfihar.android.apg.demo;
import java.util.Arrays;
import org.thialfihar.android.apg.demo.R;
import org.thialfihar.android.apg.integration.ApgContentProviderHelper;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class ContentProviderDemoActivity extends Activity {
Activity mActivity;
TextView mOutputTextView;
TextView mCiphertextTextView;
TextView mDataTextView;
ApgContentProviderHelper mApgContentProviderHelper;
/**
* Instantiate View for this Activity
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_provider_demo);
mActivity = this;
mOutputTextView = (TextView) findViewById(R.id.content_provider_output);
mApgContentProviderHelper = new ApgContentProviderHelper(mActivity);
}
public void test1OnClick(View view) {
long[] test = mApgContentProviderHelper.getPublicKeyIdsFromEmail("user@example.com");
mOutputTextView.setText(Arrays.toString(test));
}
public void test2OnClick(View view) {
boolean test = mApgContentProviderHelper.hasPublicKeyForEmail("user@example.com");
if (test) {
mOutputTextView.setText("true");
} else {
mOutputTextView.setText("false");
}
}
}

View File

@ -24,7 +24,7 @@ import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.widget.Toast; import android.widget.Toast;
public class ContentProviderHelper { public class ApgContentProviderHelper {
public static final String AUTHORITY = Constants.APG_PACKAGE_NAME; public static final String AUTHORITY = Constants.APG_PACKAGE_NAME;
public static final Uri CONTENT_URI_PUBLIC_KEY_RING_BY_KEY_ID = Uri.parse("content://" public static final Uri CONTENT_URI_PUBLIC_KEY_RING_BY_KEY_ID = Uri.parse("content://"
@ -39,7 +39,7 @@ public class ContentProviderHelper {
private Context activity; private Context activity;
public ContentProviderHelper(Activity activity) { public ApgContentProviderHelper(Activity activity) {
this.activity = activity; this.activity = activity;
} }

View File

@ -293,7 +293,7 @@ public class ApgIntentHelper {
long[] initialKeyIds = null; long[] initialKeyIds = null;
if (apgData == null || !apgData.hasEncryptionKeys()) { if (apgData == null || !apgData.hasEncryptionKeys()) {
ContentProviderHelper cPHelper = new ContentProviderHelper(activity); ApgContentProviderHelper cPHelper = new ApgContentProviderHelper(activity);
initialKeyIds = cPHelper.getPublicKeyIdsFromEmail(emails); initialKeyIds = cPHelper.getPublicKeyIdsFromEmail(emails);

View File

@ -58,7 +58,7 @@ public class ApgContract {
} }
public static final String CONTENT_AUTHORITY_EXTERNAL = Constants.PACKAGE_NAME; public static final String CONTENT_AUTHORITY_EXTERNAL = Constants.PACKAGE_NAME;
public static final String CONTENT_AUTHORITY_INTERNAL = Constants.PACKAGE_NAME + "_internal"; public static final String CONTENT_AUTHORITY_INTERNAL = Constants.PACKAGE_NAME + ".internal";
private static final Uri BASE_CONTENT_URI_INTERNAL = Uri.parse("content://" private static final Uri BASE_CONTENT_URI_INTERNAL = Uri.parse("content://"
+ CONTENT_AUTHORITY_INTERNAL); + CONTENT_AUTHORITY_INTERNAL);

View File

@ -73,14 +73,14 @@ public class ApgProvider extends ContentProvider {
private static final int DATA_STREAM = 301; private static final int DATA_STREAM = 301;
protected static boolean sInternalProvider; protected boolean mInternalProvider;
protected static UriMatcher sUriMatcher; protected UriMatcher mUriMatcher;
/** /**
* Build and return a {@link UriMatcher} that catches all {@link Uri} variations supported by * Build and return a {@link UriMatcher} that catches all {@link Uri} variations supported by
* this {@link ContentProvider}. * this {@link ContentProvider}.
*/ */
protected static UriMatcher buildUriMatcher(boolean internalProvider) { protected UriMatcher buildUriMatcher(boolean internalProvider) {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
String authority; String authority;
@ -205,6 +205,8 @@ public class ApgProvider extends ContentProvider {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public boolean onCreate() { public boolean onCreate() {
mUriMatcher = buildUriMatcher(mInternalProvider);
mApgDatabase = new ApgDatabase(getContext()); mApgDatabase = new ApgDatabase(getContext());
return true; return true;
} }
@ -212,7 +214,7 @@ public class ApgProvider extends ContentProvider {
/** {@inheritDoc} */ /** {@inheritDoc} */
@Override @Override
public String getType(Uri uri) { public String getType(Uri uri) {
final int match = sUriMatcher.match(uri); final int match = mUriMatcher.match(uri);
switch (match) { switch (match) {
case PUBLIC_KEY_RING: case PUBLIC_KEY_RING:
case PUBLIC_KEY_RING_BY_EMAILS: case PUBLIC_KEY_RING_BY_EMAILS:
@ -302,7 +304,7 @@ public class ApgProvider extends ContentProvider {
projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "." projectionMap.put(KeyRingsColumns.MASTER_KEY_ID, Tables.KEY_RINGS + "."
+ KeyRingsColumns.MASTER_KEY_ID); + KeyRingsColumns.MASTER_KEY_ID);
// only give out keyRing blob when we are using the internal content provider // only give out keyRing blob when we are using the internal content provider
if (sInternalProvider) { if (mInternalProvider) {
projectionMap.put(KeyRingsColumns.KEY_RING_DATA, Tables.KEY_RINGS + "." projectionMap.put(KeyRingsColumns.KEY_RING_DATA, Tables.KEY_RINGS + "."
+ KeyRingsColumns.KEY_RING_DATA); + KeyRingsColumns.KEY_RING_DATA);
} }
@ -331,7 +333,7 @@ public class ApgProvider extends ContentProvider {
projectionMap.put(KeysColumns.EXPIRY, KeysColumns.EXPIRY); projectionMap.put(KeysColumns.EXPIRY, KeysColumns.EXPIRY);
projectionMap.put(KeysColumns.KEY_RING_ROW_ID, KeysColumns.KEY_RING_ROW_ID); projectionMap.put(KeysColumns.KEY_RING_ROW_ID, KeysColumns.KEY_RING_ROW_ID);
// only give out keyRing blob when we are using the internal content provider // only give out keyRing blob when we are using the internal content provider
if (sInternalProvider) { if (mInternalProvider) {
projectionMap.put(KeysColumns.KEY_DATA, KeysColumns.KEY_DATA); projectionMap.put(KeysColumns.KEY_DATA, KeysColumns.KEY_DATA);
} }
projectionMap.put(KeysColumns.RANK, KeysColumns.RANK); projectionMap.put(KeysColumns.RANK, KeysColumns.RANK);
@ -399,7 +401,7 @@ public class ApgProvider extends ContentProvider {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
SQLiteDatabase db = mApgDatabase.getReadableDatabase(); SQLiteDatabase db = mApgDatabase.getReadableDatabase();
int match = sUriMatcher.match(uri); int match = mUriMatcher.match(uri);
switch (match) { switch (match) {
case PUBLIC_KEY_RING: case PUBLIC_KEY_RING:
@ -579,7 +581,7 @@ public class ApgProvider extends ContentProvider {
Uri rowUri = null; Uri rowUri = null;
long rowId = -1; long rowId = -1;
try { try {
final int match = sUriMatcher.match(uri); final int match = mUriMatcher.match(uri);
switch (match) { switch (match) {
case PUBLIC_KEY_RING: case PUBLIC_KEY_RING:
@ -641,7 +643,7 @@ public class ApgProvider extends ContentProvider {
final SQLiteDatabase db = mApgDatabase.getWritableDatabase(); final SQLiteDatabase db = mApgDatabase.getWritableDatabase();
int count; int count;
final int match = sUriMatcher.match(uri); final int match = mUriMatcher.match(uri);
String defaultSelection = null; String defaultSelection = null;
switch (match) { switch (match) {
@ -691,7 +693,7 @@ public class ApgProvider extends ContentProvider {
String defaultSelection = null; String defaultSelection = null;
int count = 0; int count = 0;
try { try {
final int match = sUriMatcher.match(uri); final int match = mUriMatcher.match(uri);
switch (match) { switch (match) {
case PUBLIC_KEY_RING_BY_ROW_ID: case PUBLIC_KEY_RING_BY_ROW_ID:
case SECRET_KEY_RING_BY_ROW_ID: case SECRET_KEY_RING_BY_ROW_ID:
@ -814,7 +816,7 @@ public class ApgProvider extends ContentProvider {
@Override @Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
int match = sUriMatcher.match(uri); int match = mUriMatcher.match(uri);
if (match != DATA_STREAM) { if (match != DATA_STREAM) {
throw new FileNotFoundException(); throw new FileNotFoundException();
} }

View File

@ -24,9 +24,8 @@ package org.thialfihar.android.apg.provider;
*/ */
public class ApgProviderExternal extends ApgProvider { public class ApgProviderExternal extends ApgProvider {
static { public ApgProviderExternal() {
sInternalProvider = false; mInternalProvider = false;
sUriMatcher = buildUriMatcher(sInternalProvider);
} }
} }

View File

@ -22,9 +22,8 @@ package org.thialfihar.android.apg.provider;
*/ */
public class ApgProviderInternal extends ApgProvider { public class ApgProviderInternal extends ApgProvider {
static { public ApgProviderInternal() {
sInternalProvider = true; mInternalProvider = true;
sUriMatcher = buildUriMatcher(sInternalProvider);
} }
} }