Added category provider.
Not used by anything yet.
This commit is contained in:
		
							parent
							
								
									99f7cab62e
								
							
						
					
					
						commit
						8757acca1a
					
				@ -104,6 +104,11 @@
 | 
				
			|||||||
            android:name="org.fdroid.fdroid.data.PackageProvider"
 | 
					            android:name="org.fdroid.fdroid.data.PackageProvider"
 | 
				
			||||||
            android:exported="false"/>
 | 
					            android:exported="false"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <provider
 | 
				
			||||||
 | 
					            android:authorities="org.fdroid.fdroid.data.CategoryProvider"
 | 
				
			||||||
 | 
					            android:name="org.fdroid.fdroid.data.CategoryProvider"
 | 
				
			||||||
 | 
					            android:exported="false"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <provider
 | 
					        <provider
 | 
				
			||||||
            android:name="org.fdroid.fdroid.installer.ApkFileProvider"
 | 
					            android:name="org.fdroid.fdroid.installer.ApkFileProvider"
 | 
				
			||||||
            android:authorities="org.fdroid.fdroid.installer.ApkFileProvider"
 | 
					            android:authorities="org.fdroid.fdroid.installer.ApkFileProvider"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										169
									
								
								app/src/main/java/org/fdroid/fdroid/data/CategoryProvider.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								app/src/main/java/org/fdroid/fdroid/data/CategoryProvider.java
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,169 @@
 | 
				
			|||||||
 | 
					package org.fdroid.fdroid.data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.content.ContentValues;
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.content.UriMatcher;
 | 
				
			||||||
 | 
					import android.database.Cursor;
 | 
				
			||||||
 | 
					import android.net.Uri;
 | 
				
			||||||
 | 
					import android.support.annotation.NonNull;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.fdroid.fdroid.data.Schema.CategoryTable.Cols;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class CategoryProvider extends FDroidProvider {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static final class Helper {
 | 
				
			||||||
 | 
					        private Helper() { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static long ensureExists(Context context, String category) {
 | 
				
			||||||
 | 
					            long id = getCategoryId(context, category);
 | 
				
			||||||
 | 
					            if (id <= 0) {
 | 
				
			||||||
 | 
					                ContentValues values = new ContentValues(1);
 | 
				
			||||||
 | 
					                values.put(Cols.NAME, category);
 | 
				
			||||||
 | 
					                Uri uri = context.getContentResolver().insert(getContentUri(), values);
 | 
				
			||||||
 | 
					                id = Long.parseLong(uri.getLastPathSegment());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return id;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static long getCategoryId(Context context, String category) {
 | 
				
			||||||
 | 
					            String[] projection = new String[] {Cols.ROW_ID};
 | 
				
			||||||
 | 
					            Cursor cursor = context.getContentResolver().query(getCategoryUri(category), projection, null, null, null);
 | 
				
			||||||
 | 
					            if (cursor == null) {
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                if (cursor.getCount() == 0) {
 | 
				
			||||||
 | 
					                    return 0;
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    cursor.moveToFirst();
 | 
				
			||||||
 | 
					                    return cursor.getLong(cursor.getColumnIndexOrThrow(Cols.ROW_ID));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } finally {
 | 
				
			||||||
 | 
					                cursor.close();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private class Query extends QueryBuilder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        protected String getRequiredTables() {
 | 
				
			||||||
 | 
					            return Schema.CategoryTable.NAME;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @Override
 | 
				
			||||||
 | 
					        public void addField(String field) {
 | 
				
			||||||
 | 
					            appendField(field, getTableName());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final String PROVIDER_NAME = "CategoryProvider";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final UriMatcher MATCHER = new UriMatcher(-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final String PATH_CATEGORY_NAME = "categoryName";
 | 
				
			||||||
 | 
					    private static final String PATH_CATEGORY_ID = "categoryId";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static {
 | 
				
			||||||
 | 
					        MATCHER.addURI(getAuthority(), PATH_CATEGORY_NAME + "/*", CODE_SINGLE);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static Uri getContentUri() {
 | 
				
			||||||
 | 
					        return Uri.parse("content://" + getAuthority());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static Uri getCategoryUri(String categoryName) {
 | 
				
			||||||
 | 
					        return getContentUri()
 | 
				
			||||||
 | 
					                .buildUpon()
 | 
				
			||||||
 | 
					                .appendPath(PATH_CATEGORY_NAME)
 | 
				
			||||||
 | 
					                .appendPath(categoryName)
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Not actually used as part of the external API to this content provider.
 | 
				
			||||||
 | 
					     * Rather, used as a mechanism for returning the ID of a newly inserted row after calling
 | 
				
			||||||
 | 
					     * {@link android.content.ContentProvider#insert(Uri, ContentValues)}, as that is only able
 | 
				
			||||||
 | 
					     * to return a {@link Uri}. The {@link Uri#getLastPathSegment()} of this URI contains a
 | 
				
			||||||
 | 
					     * {@link Long} which is the {@link Cols#ROW_ID} of the newly inserted row.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static Uri getCategoryIdUri(long categoryId) {
 | 
				
			||||||
 | 
					        return getContentUri()
 | 
				
			||||||
 | 
					                .buildUpon()
 | 
				
			||||||
 | 
					                .appendPath(PATH_CATEGORY_ID)
 | 
				
			||||||
 | 
					                .appendPath(Long.toString(categoryId))
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected String getTableName() {
 | 
				
			||||||
 | 
					        return Schema.CategoryTable.NAME;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected String getProviderName() {
 | 
				
			||||||
 | 
					        return "CategoryProvider";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static String getAuthority() {
 | 
				
			||||||
 | 
					        return AUTHORITY + "." + PROVIDER_NAME;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected UriMatcher getMatcher() {
 | 
				
			||||||
 | 
					        return MATCHER;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected QuerySelection querySingle(String categoryName) {
 | 
				
			||||||
 | 
					        final String selection = getTableName() + "." + Cols.NAME + " = ?";
 | 
				
			||||||
 | 
					        final String[] args = {categoryName};
 | 
				
			||||||
 | 
					        return new QuerySelection(selection, args);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Cursor query(@NonNull Uri uri, String[] projection, String customSelection, String[] selectionArgs, String sortOrder) {
 | 
				
			||||||
 | 
					        if (MATCHER.match(uri) != CODE_SINGLE) {
 | 
				
			||||||
 | 
					            throw new UnsupportedOperationException("Invalid URI for content provider: " + uri);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        QuerySelection selection = new QuerySelection(customSelection, selectionArgs)
 | 
				
			||||||
 | 
					                .add(querySingle(uri.getLastPathSegment()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Query query = new Query();
 | 
				
			||||||
 | 
					        query.addSelection(selection);
 | 
				
			||||||
 | 
					        query.addFields(projection);
 | 
				
			||||||
 | 
					        query.addOrderBy(sortOrder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Cursor cursor = LoggingQuery.query(db(), query.toString(), query.getArgs());
 | 
				
			||||||
 | 
					        cursor.setNotificationUri(getContext().getContentResolver(), uri);
 | 
				
			||||||
 | 
					        return cursor;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Deleting of categories is not required.
 | 
				
			||||||
 | 
					     * It doesn't matter if we have a category in the database when no apps are in that category.
 | 
				
			||||||
 | 
					     * They wont take up much space, and it is the presence of rows in the
 | 
				
			||||||
 | 
					     * {@link Schema.CatJoinTable} which decides whether a category is displayed in F-Droid or not.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int delete(@NonNull Uri uri, String where, String[] whereArgs) {
 | 
				
			||||||
 | 
					        throw new UnsupportedOperationException("Delete not supported for " + uri + ".");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public Uri insert(@NonNull Uri uri, ContentValues values) {
 | 
				
			||||||
 | 
					        long rowId = db().insertOrThrow(getTableName(), null, values);
 | 
				
			||||||
 | 
					        getContext().getContentResolver().notifyChange(AppProvider.getCanUpdateUri(), null);
 | 
				
			||||||
 | 
					        return getCategoryIdUri(rowId);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Category names never change. If an app originally is in category "Games" and then in a
 | 
				
			||||||
 | 
					     * future repo update is now in "Games & Stuff", then both categories can exist quite happily.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int update(@NonNull Uri uri, ContentValues values, String where, String[] whereArgs) {
 | 
				
			||||||
 | 
					        throw new UnsupportedOperationException("Update not supported for " + uri + ".");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user