How to use Shared Preferences in MVP without Dagger and not causing Presenter to be Context dependent?

前端 未结 4 1765
北恋
北恋 2020-12-23 11:51

I\'m trying to implement MVP without Dagger (for learning purposes). But I got to the problem - I use Repository patter to get raw data either from cache (Shared Preferences

4条回答
  •  春和景丽
    2020-12-23 12:08

    This is how I implement it. You can design it with an interface where you have different implementation for your app and test. I have used interface PersistentStorage which I provide depdencdy from UI/tests. This is just an idea, feel free to modify it.

    From your Activity/Fragment

    public static final String PREF_NAME = "app_info_cache";
    
    @Inject
    DataManager dataManager;
    
    void injectDepedendency(){
        DaggerAppcompnent.inject(this);//Normal DI withDagger
        dataManager.setPersistentStorage(new PersistentStorageImp(getSharedPreferences()));
    }
    
    //In case you need to pass from Fragment then you need to resolve getSharedPreferences with Context
    SharedPreferences getSharedPreferences() {
        return getSharedPreferences(PREF_NAME,
                Context.MODE_MULTI_PROCESS | Context.MODE_MULTI_PROCESS);
    }
    
    
    //This is how you can use in Testing
    
    @Inject
    DataManager dataManager;
    
    @Before
    public void injectDepedendency(){
        DaggerTestAppcompnent.inject(this);
        dataManager.setPersistentStorage(new MockPersistentStorageImp());
    }
    
    @Test
    public void testSomeFeature_ShouldStoreInfo(){
    
    }
    
        /**
        YOUR DATAMANAGER
    */
    
    public interface UserDataManager {
    
        void setPersistentStorage(PersistentStorage persistentStorage);
    }
    
    public class UserDataManagerImp implements UserDataManager{
        PersistentStorage persistentStorage;
    
        public void setPersistentStorage(PersistentStorage persistentStorage){
            this.persistentStorage = persistentStorage;
        }
    }
    
    
    public interface PersistentStorage {
        /**
            Here you can define all the methods you need to store data in preferences.
        */
        boolean getBoolean(String arg, boolean defaultval);
    
        void putBoolean(String arg, boolean value);
    
        String getString(String arg, String defaultval);
    
        void putString(String arg, String value);
    
    }
    
    /**
        PersistentStorage Implementation for Real App
    */
    public class PersistentStorageImp implements PersistentStorage {
        SharedPreferences preferences;
    
        public PersistentStorageImp(SharedPreferences preferences){
            this.preferences = preferences;
        }
    
        private SharedPreferences getSharedPreferences(){
            return preferences;
        }
    
        public String getString(String arg, String defaultval) {
            SharedPreferences pref = getSharedPreferences();
            return pref.getString(arg, defaultval);
        }
    
        public boolean getBoolean(String arg, boolean defaultval) {
            SharedPreferences pref = getSharedPreferences();
            return pref.getBoolean(arg, defaultval);
        }
    
        public void putBoolean(String arg, boolean value) {
            SharedPreferences pref = getSharedPreferences();
            SharedPreferences.Editor editor = pref.edit();
            editor.putBoolean(arg, value);
            editor.commit();
        }
    
        public void putString(String arg, String value) {
            SharedPreferences pref = getSharedPreferences();
            SharedPreferences.Editor editor = pref.edit();
            editor.putString(arg, value);
            editor.commit();
        }
    }
    
    /**
        PersistentStorage Implementation for testing
    */
    
    public class MockPersistentStorageImp implements PersistentStorage {
        private Map map = new HashMap<>();
        @Override
        public boolean getBoolean(String key, boolean defaultval) {
            if(map.containsKey(key)){
                return (Boolean) map.get(key);
            }
            return defaultval;
        }
    
        @Override
        public void putBoolean(String key, boolean value) {
            map.put(key,value);
        }
    
        @Override
        public String getString(String key, String defaultval) {
            if(map.containsKey(key)){
                return (String) map.get(key);
            }
            return defaultval;
        }
    
        @Override
        public void putString(String key, String value) {
            map.put(key,value);
        }
    }
    

提交回复
热议问题